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

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

java 复制代码
    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;

        // 查找需要的视频轨道与音频轨道index
        for (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("音频生成失败");
        }
    }

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

java 复制代码
    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;

        // 查找需要的视频轨道与音频轨道index
        for (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("视频生成失败");
        }
    }
相关推荐
木斯佳3 小时前
HarmonyOS 6实战(源码解析篇):音乐播放器的音频焦点管理(上)——AudioSession与打断机制
华为·音视频·harmonyos
卢锡荣5 小时前
Type-c OTG数据与充电如何进行交互使用应用讲解
c语言·开发语言·计算机外设·电脑·音视频
沛沛老爹9 小时前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
等风来不如迎风去9 小时前
【UniVA】1:统一的视频agent:智能体系统,专门用于处理复杂的视频生成、编辑和理解任务
音视频
知秋一叶12310 小时前
Miloco v0.1.6 :米家摄像头清晰度配置 + RTSP 音频传输
人工智能·音视频·智能家居
xmRao12 小时前
Qt+FFmpeg 实现音频重采样
qt·ffmpeg·音视频
发哥来了13 小时前
主流AI视频生成模型商用化能力评测:三大核心维度对比分析
大数据·人工智能·音视频
发哥来了13 小时前
《AI图生视频技术深度剖析:原理、应用与发展趋势》
人工智能·音视频
EasyCVR1 天前
国标GB28181视频监控平台EasyCVR智慧农场监管可视化方案设计
音视频
雾江流1 天前
HDx播放器1.0.184 | 支持多种格式和4K/8K高清视频播放,内置推特~脸书下载器
音视频·软件工程