使用MediaMuxer创建的不可流式处理的视频文件

时间:2014-05-29 13:06:29

标签: android mediacodec mediamuxer

我正在使用MediaCodec对视频进行编码。帧通过相机预览回调到MediaCodec实例(没有使用Surface)。我使用JCodec库进行多路复用,我可以流式传输视频(视频播放器显示正确的持续时间,我可以使用搜索栏更改视频位置)。

今天我尝试使用MediaMuxer代替JCodec而且我的视频看起来仍然很好,但持续时间绝对不正确(几小时而不是一分钟)和寻求酒吧根本不工作。

mediaMuxer = new MediaMuxer("/path/to/video.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

收到MediaCodec.INFO_OUTPUT_FORMAT_CHANGED后,我们会懒惰地调用以下代码:

videoTrackIndex = mediaMuxer.addTrack(encoder.getMediaFormat());
mediaMuxer.start();

我使用以下代码对帧进行编码:

mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, bufferInfo);
在某些定位后,

byteBufferbufferInfo直接来自MediaCodec

byteBuffer.position(bufferInfo.offset);
byteBuffer.limit(bufferInfo.offset + bufferInfo.size);

正确设置演示时间:

mMediaCodec.queueInputBuffer(inputBufferIndex, 0, getWidth() * getHeight() * 1.5, System.nanoTime() / 1000, 0);

在记录的最后我做了:

mediaMuxer.stop();
mediaMuxer.release();

日志:

I/MPEG4Writer﹕ setStartTimestampUs: 0
I/MPEG4Writer﹕ Earliest track starting time: 0
D/MPEG4Writer﹕ Stopping Video track
I/MPEG4Writer﹕ Received total/0-length (770/0) buffers and encoded 770 frames. - video
D/MPEG4Writer﹕ Stopping Video track source
D/MPEG4Writer﹕ Video track stopped
D/MPEG4Writer﹕ Stopping writer thread
D/MPEG4Writer﹕ 0 chunks are written in the last batch
D/MPEG4Writer﹕ Writer thread stopped
I/MPEG4Writer﹕ The mp4 file will not be streamable.
D/MPEG4Writer﹕ Stopping Video track

我猜The mp4 file will not be streamable.有关问题的信号。

更新

我在另一台设备上测试了我的应用程序(LG G2),它执行了更详细的日志记录。生成的文件持续时间很长。日志为here,视频文件为here

1 个答案:

答案 0 :(得分:5)

感谢@fadden,我能够找出问题所在。我实际上发送了我的第一帧,其中presentationTimeUs = 0.这是因为我没有正确处理带有MediaCodec.BUFFER_FLAG_CODEC_CONFIG标志的帧。我实际上是将它们提供给复用器,但我应该做的是使用以下代码跳过它们(根据example):

if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
  mBufferInfo.size = 0;
}