首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用android MediaMuxer混合不同长度的音频和视频

如何使用android MediaMuxer混合不同长度的音频和视频
EN

Stack Overflow用户
提问于 2018-07-26 12:10:47
回答 1查看 2.2K关注 0票数 0

我想使用混合视频(1分钟)和音频(10秒)。我想要音频重复,直到视频结束。当我使用下面的代码时,音频只播放10秒。有人知道怎么解决这个问题吗?

代码语言:javascript
复制
 mediaMuxer.start();
        while ((sampleSize = videoExtra.readSampleData(videoBuffer, 0 )) != -1) {
            videoBufferInfo.offset = 0;
            videoBufferInfo.size = sampleSize;
            videoBufferInfo.presentationTimeUs = videoExtra.getSampleTime();
            videoBufferInfo.flags = videoExtra.getSampleFlags();
            mediaMuxer.writeSampleData(videoIndex, videoBuffer, videoBufferInfo);

            videoExtra.advance();
        }



        while ((audioSize = musicExtra.readSampleData(audioBuffer, 0)) != -1) {
            audioBufferInfo.offset = 0;
            audioBufferInfo.size = audioSize;
            audioBufferInfo.presentationTimeUs = musicExtra.getSampleTime();
            audioBufferInfo.flags = musicExtra.getSampleFlags();
            mediaMuxer.writeSampleData(audioIndex, audioBuffer, audioBufferInfo);
            musicExtra.advance();
        }
        musicExtra.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC);

        videoExtra.release();
        musicExtra.release();
        mediaMuxer.stop();
        mediaMuxer.release();
EN

回答 1

Stack Overflow用户

发布于 2018-12-03 07:16:13

  1. 三个输入参数: 字符串videoPath,字符串audioPath,字符串outputPath
  2. 获取视频持续时间及其跟踪索引: videoExtractor =新MediaExtractor();videoExtractor.setDataSource(videoPath);MediaFormat videoFormat = null;int videoTrackCount = videoExtractor.getTrackCount();//vedio max输入大小int frameMaxInputSize = 0;int frameRate = 0;long videoDuration = 0;for (int i= 0;i< videoTrackCount;i++) { videoFormat = videoExtractor.getTrackFormat(i);String mimeType =videoFormat.getString(videoFormat.getString);如果( videoFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);(“视频/”)){ /* *只使用第一个音轨*/ videoTrackIndex = i;frameMaxInputSize =mimeType.startsWith frameRate = videoFormat.getInteger(MediaFormat.KEY_FRAME_RATE);videoDuration = videoFormat.getLong(MediaFormat.KEY_DURATION);break;}}如果(videoTrackIndex <0){Log.e(标记,“错误输入文件::无Vedio跟踪”);返回;}
  3. 获取音频信息 audioExtractor =新的MediaExtractor();audioExtractor.setDataSource(audioPath);MediaFormat audioFormat =空;int audioTrackCount = audioExtractor.getTrackCount();audioExtractor =新的MediaExtractor();int audioTrackCount = audioExtractor.getTrackCount();for (int i= 0;i< audioTrackCount;i++) { audioFormat = audioExtractor.getTrackFormat(i);String mimeType =audioFormat.getString(MimeType);if ((“音频/”)){= i;如果(audioTrackIndex <0){Log.e(标记,“错误输入文件::No Audio track");返回;}
  4. 编写视频数据: videoExtractor.unselectTrack(videoTrackIndex);();(真){ int =(,0);如果( videoExtractor.unselectTrack(videoTrackIndex);< 0) {readVideoSampleSize中断;} long videoSampleTime = videoExtractor.getSampleTime();videoBufferInfo.size = readVideoSampleSize;videoBufferInfo.presentationTimeUs = videoSampleTime;//视频videoBufferInfo.表示时刻表+= 1000 * 1000 / frameRate;videoBufferInfo.offset = 0;videoBufferInfo.flags = videoExtractor.getSampleFlags();videoBufferInfo.presentationTimeUs byteBuffer,videoBufferInfo);videoExtractor.advance();}
  5. 编写音频数据 长音频呈现时间u= 0;MediaCodec.BufferInfo audioBufferInfo =新MediaCodec.BufferInfo();audioExtractor.selectTrack(audioTrackIndex);/* *最后一次音频演示时间。*/ long lastEndAudioTimeUs = 0;while (true) { int readAudioSampleSize = audioExtractor.readSampleData(byteBuffer,0);if (readAudioSampleSize < 0) {//如果流的结束,取消选择“如果(audioPresentationTimeUs >= videoDuration)”{/ if已到达视频时间结束,只需退出中断;}否则{/如果不是视频时间的结束,只需重复。_~_mediaMuxer.writeSampleData(writeAudioTrackIndex,byteBuffer,audioBufferInfo);audioExtractor.advance();}
  6. 发布资源. if (mediaMuxer != null) { try { mediaMuxer.stop();mediaMuxer.release();} catch (异常e) { e.printStackTrace();} if (videoExtractor != null) { try { videoExtractor.release();} catch (异常e) { e.printStackTrace();}}如果(audioExtractor != null) {尝试{ audioExtractor.release();} catch (异常e) { e.printStackTrace();}}

希望这能有所帮助!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51538557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档