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.

Original source