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

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

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("视频生成失败");
        }
    }
相关推荐
REDcker2 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19982 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君2 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥3 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276423 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk3 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS3 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276423 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838683 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川3 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频