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

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

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("视频生成失败");
        }
    }
相关推荐
甜到心里的蛋糕4 小时前
AI 生成 MV 音频异响排查:频谱定位、片段替换与 Nginx 缓存
人工智能·python·nginx·ffmpeg·音视频·音频处理
镭封14 小时前
从视频文案提取到 AI 配音,短视频制作需要哪些工具?
人工智能·智能手机·音视频·语音识别·媒体
2601_9556624616 小时前
搞笑视频配音怎么做?如何选择有辨识度的声音
大数据·人工智能·音视频·语音识别·媒体
镭封19 小时前
自媒体内容生产怎么提速?文案整理、配音与剪辑流程
人工智能·小程序·音视频·语音识别·媒体
2601_9654490820 小时前
AI视频制作:做传统文化视频,古文断句配音难,AI怎么正确断句配音?
人工智能·音视频
探鸽小钛1 天前
4G 终端 ES8311 - 挂断一次,下次说话就没声了之解决办法
物联网·音视频·嵌入式·esp32·webrtc
weipt1 天前
视频人物跨时长快速检索:从一闪而过的背影,精确找到他
音视频
LittroInno1 天前
边缘AI模组选型:把视频带宽、压缩和推理吞吐分别算清
人工智能·音视频·边缘计算·视频编码·模组选型·视频带宽·tofu6
AI视频工具指南1 天前
如何保持AI视频人物声音的一致性?
音视频
zhizhizhuzhuxia1 天前
适合自媒体新手的短视频配音工具有哪些
音视频·媒体