I said in the last article how to use JNI for H264 encoding, but it's not very practical because of the efficiency problem.
After several days of tossing, and referring to the general implementation of the http://www.javaeye.com/problems/27244 Android real-time coding problem, but only thinking, has not entered the stage of code implementation.
More important 2 classes of Mediarecorder Parcelfiledescriptor
Mediarecorder is a class that Android provides for collecting code, and Parcelfiledescriptor is a class that implements Setoutputfile with sockets.
In the process of testing the Liuzongan program, I found that the other person has achieved most of the functions we need, the only thing to deal with is the server-side program.
Here I guess the process of mediarecorder writing files
1, Mediarecorder writes a fixed head, estimates that the placeholder is 00H (the placeholder length seems to be related to the encoder used)
Insert more 6D (mdat box)
2, start coding, and the code after not a frame to add to the file, see 00 00 80 did not, understand h263 comrade must be very familiar with, is the 263 video logo.
(If there is audio data, it will be with the video data staggered together, but our goal is only real-time coding video streaming, do not need to process audio, so in the initialization of the Mediarecorder I do not want to Mediarecorder.setaudiosource, so there's no audio data. )
3 End capture. Mediarecorder should be returned to the head of the file to populate the header. But because it is not a real file relationship, can not return to the head, so the file header attached to the back of the file, feeling that is Liuzongan this guy asked the answer to the question.
This is the length of the file at the beginning of Mdat box, which replaces 00 00 00 08.
This is the header of the 3GP file, which replaces the beginning placeholder.
4 Finally, mediarecorder 3gp file Moov box, which is already part of the 3GP Media Index, the specific content for us has been less concerned about. We can refer to http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html study.
Let's start by saying what we're doing.
In fact, with the above description, we should be able to think of what we want to achieve is actually the video of the frame can be.
Server-side processing h263 method
11 steps to find the Mdat this string, the following data is the video data we want,
2 in the stream to find 00 00 80 This flag, each is the beginning of a frame of data
For H264 and MPEG4, to prefetch data, this is because MP4V related decoding parameters, in the Esds box, and Esds box is at the end of the collection to write, so for our program to encode a first time to obtain the relevant decoding parameters mp4v, And then using the same parameters to collect, oh so we can get the original mp4v flow
H264 Just like the AvcC box.