我使用MediaCodec
对视频进行编码。帧通过相机预览回调到MediaCodec
实例(不使用Surface)。我正在使用JCodec库进行混音,我能够流式传输制作的视频(视频播放器显示正确的持续时间,我能够用seek bar改变视频位置)。
今天我尝试使用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);
byteBuffer
和bufferInfo
是直接来自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)上测试了我的应用程序,它做了更详细的日志记录。同样的文件产生了巨大的持续时间。日志在这里,视频文件在这里
感谢@fadden,我能够找出问题。实际上我发送的第一帧是presentationTimeUs = 0。这是因为我没有正确处理带有MediaCodec.BUFFER_FLAG_CODEC_CONFIG
标志的帧。我实际上是将它们提供给muxer,但我应该做的是使用以下代码跳过它们(按示例):
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
mBufferInfo.size = 0;
}