当前位置: 首页 > news >正文

提取视频文件里的音频和无声视频

一、提取视频文件里的音频:

public static void generateMediaRadio(){// 视频提取器MediaExtractor extractor = new MediaExtractor();try {//本地视频文件extractor.setDataSource("/storage/emulated/0/mjyyfep/alpha.mp4");//网络视频文件
//                extractor.setDataSource(OwnApplicationLike.getInstance(),Uri.parse("http://zhl-file.xxfz.com.cn/group1/M08/07/B2/dr5jH1_Hd9CIbYreAAAAPBKTEOgAALdDQPnvw0AAABU754.mp4"),null);} catch (Exception e) {e.printStackTrace();
//            showShortToast("视频资源路径出错");LogUtil.eLog("视频资源路径出错");}// 获取通道数int trackCount = extractor.getTrackCount();// 视频轨道索引int radioTrackIndex = 0;// 视频格式MediaFormat radioMediaFormat = null;long radioFrameRate = 0;// 查找需要的视频轨道与音频轨道indexfor (int i = 0; i < trackCount; i++) { //遍历所以轨道MediaFormat itemMediaFormat = extractor.getTrackFormat(i);String itemMime = itemMediaFormat.getString(MediaFormat.KEY_MIME);if (itemMime.startsWith("audio")) { //获取音频轨道位置radioTrackIndex = i;radioMediaFormat = itemMediaFormat;
//                Log.d(TAG,"audio format start --- ");
//                Log.d(TAG,"audio format --> \r\n"+itemMediaFormat.toString());
//                Log.d(TAG,"audio format end --- ");extractor.selectTrack(i);long first_sampletime = extractor.getSampleTime();extractor.advance();long second_sampletime = extractor.getSampleTime();radioFrameRate = Math.abs(second_sampletime - first_sampletime);//时间戳extractor.unselectTrack(i);}}//        File outVideoFile = new File(getFileOutPath() + File.separator + "out_audio.mp4");//提取出的音频文件最终存放路径File outVideoFile = new File("/storage/emulated/0/mjyyfep/alpha_audio_1.mp3");if(outVideoFile.exists()){outVideoFile.delete();}try{// 分离音频MediaMuxer mediaMuxer = new MediaMuxer(outVideoFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);int mVideoTrackIndex  = mediaMuxer.addTrack(radioMediaFormat);mediaMuxer.start();MediaCodec.BufferInfo info =  new MediaCodec.BufferInfo();info.presentationTimeUs =  0;extractor.selectTrack(radioTrackIndex);int videoFlag = extractor.getSampleFlags();int length;ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);while ((length = extractor.readSampleData(buffer,0)) != -1){info.offset = 0;info.size = length;info.flags = videoFlag;info.presentationTimeUs += radioFrameRate;mediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info);// 预先加载后面的数据extractor.advance();}extractor.release();mediaMuxer.stop();mediaMuxer.release();//            showShortToast("音频生成成功");LogUtil.eLog("音频生成成功");}catch (Exception e){e.printStackTrace();LogUtil.eLog("音频生成失败");
//            showShortToast("音频生成失败");}}

二、提取视频文件里的无声视频

public static void generateMediaVideo(){// 视频提取器MediaExtractor extractor = new MediaExtractor();try {//本地视频文件
//            extractor.setDataSource("/storage/emulated/0/mjyyfep/my.mp4");//网络视频文件extractor.setDataSource(OwnApplicationLike.getInstance(),Uri.parse("http://zhl-file.xxfz.com.cn/group1/M08/07/B2/dr5jH1_Hd9CIbYreAAAAPBKTEOgAALdDQPnvw0AAABU754.mp4"),null);} catch (IOException e) {e.printStackTrace();LogUtil.eLog("视频资源路径出错");}// 获取通道数int trackCount = extractor.getTrackCount();// 视频轨道索引int videoTrackIndex = 0;// 视频格式MediaFormat videoMediaFormat = null;// 查找需要的视频轨道与音频轨道indexfor (int i = 0; i < trackCount; i++) { //遍历所以轨道MediaFormat itemMediaFormat = extractor.getTrackFormat(i);String itemMime = itemMediaFormat.getString(MediaFormat.KEY_MIME);if (itemMime.startsWith("video")) { //获取视频轨道位置videoTrackIndex = i;videoMediaFormat = itemMediaFormat;LogUtil.eLog("video format start --- ");LogUtil.eLog("video format --> \r\n"+itemMediaFormat.toString());LogUtil.eLog("video format end --- ");}}//        File outVideoFile = new File(getFileOutPath() + File.separator + "out_video.mp4");//提取出的无声视频最终存放路径File outVideoFile = new File("/storage/emulated/0/mjyyfep/my_video_4.mp4");if(outVideoFile.exists()){outVideoFile.delete();}try{// 分离视频MediaMuxer mediaMuxer = new MediaMuxer(outVideoFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);int mVideoTrackIndex  = mediaMuxer.addTrack(videoMediaFormat);mediaMuxer.start();MediaCodec.BufferInfo info =  new MediaCodec.BufferInfo();info.presentationTimeUs =  0;extractor.selectTrack(videoTrackIndex);int videoFlag = extractor.getSampleFlags();long videoFrameRate = 1000 * 1000 /(videoMediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE));int length;ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);while ((length = extractor.readSampleData(buffer,0)) != -1){info.offset = 0;info.size = length;info.flags = videoFlag;info.presentationTimeUs += videoFrameRate;mediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info);// 预先加载后面的数据extractor.advance();}extractor.release();mediaMuxer.stop();mediaMuxer.release();LogUtil.eLog("生成视频文件成功");}catch (Exception e){e.printStackTrace();LogUtil.eLog("视频生成失败");}}

http://www.lryc.cn/news/147355.html

相关文章:

  • SpringBoot原理
  • MySQL事务原理、MVCC详解
  • 在Windows操作系统上安装Neo4j数据库
  • 国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
  • 24 Linux高级篇-备份与恢复
  • 微信小程序的图书馆预约系统设计与实现
  • 《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办
  • WebGpu VS WebGL
  • HTML <tfoot> 标签
  • VScode的PHP远程调试模式Xdebug
  • HTML5-2-链接
  • Java--常用jar命令
  • 微服务中间件--多级缓存
  • clickhouse系列3:clickhouse分析英国房产价格数据
  • 2023京东口腔护理赛道行业数据分析(京东销售数据分析)
  • 安服面试 --- 01
  • ExpressLRS开源之RC链路性能测试
  • el-form表单el-form-item prop一次验证两个值
  • HTTP 代理原理及 Python 简单实现
  • 数据结构--队列与循环队列
  • 八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
  • 版本控制 Git工具的使用
  • GNS3 在 Linux 上的安装指南
  • Mybatis中 list.size() = 1 但显示 All elements are null
  • Soul的社交元宇宙之路,还有多远?
  • 如何解决Memcached缓存击穿和雪崩问题
  • uniapp 开发之仿抖音,上下滑动切换视频、点击小爱心效果
  • 【C++设计模式】依赖倒转原则
  • 浙江首例!金华银行基于完全国产自研数据库构建新一代核心系统
  • ASP.NET Core 中的 静态文件