I created a h264 raw video file, and I was able to mux it with Android MediaMuxer on Android 4.3 and up. Now I need to support Android versions 4.1 and 4.2. I found Jcodec. And there is an example for doing this:
https://github.com/jcodec/jcodec/blob/master/samples/main/java/org/jcodec/samples/mux/AVCMP4Mux.java
But I'm getting java.nio.ReadOnlyBufferException exception at line 70:
H264Utils.encodeMOVPacket(data);
I guess this code is not for Android? How do I fix this. Can someone familiar with Jcodec help on this?
I gave up on Jcodec. It exposes too many codec internal stuff, and there is no documentation on usage at all. Mp4Parser did the job for me, and it's simple. Here is the code I mux raw h264 video into mp4 container:
String h264Path = "path to my h264 file, generated by Android MediaCodec";
DataSource videoFile = new FileDataSourceImpl(h264Path);
H264TrackImpl h264Track = new H264TrackImpl(videoFile, "eng", 5, 1); // 5fps. you can play with timescale and timetick to get non integer fps, 23.967 is 24000/1001
Movie movie = new Movie();
movie.addTrack(h264Track);
Container out = new DefaultMp4Builder().build(movie);
FileOutputStream fos = new FileOutputStream(new File("path to my generated file.mp4"));
out.writeContainer(fos.getChannel());
fos.close();
Code examples were found here. Loop is closed! Now my video encoder implementation works from Android 4.1 and up, without the need of FFMpeg
BTW: Android stock "Gallery" app uses Mp4Parser, listed in its open source licenses.