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

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

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("视频生成失败");
        }
    }
相关推荐
zc.z6 小时前
JAVA实现:纯PCM格式音频转换成BASE64
java·音视频·pcm
一苇以航3210 小时前
LE Audio低功耗蓝牙音频详解 (三)
音视频·蓝牙·ble·le audio
a里啊里啊13 小时前
软考-软件评测师:知识点整理(九)——其他杂项
音视频
苏州汇成元电子科技15 小时前
为什么越来越多AI设备开始使用I-PEX 81463-100B-02-D 30Pin极细同轴线束?
人工智能·音视频·硬件工程·信号处理·材料工程
ZC跨境爬虫16 小时前
跟着 MDN 学 HTML day_36:(深入理解 Comment 接口与 DOM 注释节点)
前端·javascript·ui·html·音视频·视频编解码
reasonsummer18 小时前
【教学类-160-25】20260507 AI视频培训-练习025“豆包AI视频《一日生活》+豆包图片风格:二次元
音视频·豆包
LCG元19 小时前
STM32实战:基于STM32F407的FFT频谱分析(音频信号处理)
stm32·音视频·信号处理
小何开发21 小时前
ffmpeg 安装与使用: 将视频分片与组装
ffmpeg·音视频
EasyDSS21 小时前
私有化视频会议系统/智能会议管理系统EasyDSS打造全场景音视频协作新生态
音视频
淘小白_TXB219621 小时前
微博图文视频批量采集软件用户手册
音视频