Non-streamable video file created with MediaMuxer
android, android-mediacodec, mediamuxer
Solution
Thanks to @fadden I was able to figure out the problem. I was actually sending my first frame with presentationTimeUs = 0. It happened because I was not handling frames with `MediaCodec.BUFFER_FLAG_CODEC_CONFIG` flag properly. I was actually feeding them to the muxer, but what I should have done is to skip them with the following code (as per example):
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
mBufferInfo.size = 0;
}
Problem
I am using `MediaCodec` to encode video. Frames are coming through the camera preview callback to the `MediaCodec` instance (no Surface used). I am using JCodec library for muxing and I am able to stream produced video (video player is showing correct duration and I am able to change video position with seek bar). Today I've tried to use `MediaMuxer` instead of `JCodec` and I've got video which still looks fine, but duration is absolutely incorrect (a few hours instead of one minute) and the seek bar is not working at all. ``` mediaMuxer = new MediaMuxer("/path/to/video.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); ``` The following code is lazily called when I receive `MediaCodec.INFO_OUTPUT_FORMAT_CHANGED`: ``` videoTrackIndex = mediaMuxer.addTrack(encoder.getMediaFormat()); mediaMuxer.start(); ``` I am encoding the frames with the following code: ``` mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, bufferInfo); ``` `byteBuffer` and `bufferInfo` are coming directly from `MediaCodec` after some positioning stuff: ``` byteBuffer.position(bufferInfo.offset); byteBuffer.limit(bufferInfo.offset + bufferInfo.size); ``` Presentation time is set correctly: ``` mMediaCodec.queueInputBuffer(inputBufferIndex, 0, getWidth() * getHeight() * 1.5, System.nanoTime() / 1000, 0); ``` And at the end of the record I do: ``` mediaMuxer.stop(); mediaMuxer.release(); ``` Logs: ``` 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 ``` I guess the `The mp4 file will not be streamable.` signals about problem. Update: I've tested my app on another device (LG G2) which does more verbose logging. The same file is produced with huge duration. Logs are here and the video file is here.