Android MediaCodec Dekodieren von h264 raw Rahmen
Ich bin mit Android MediaCodec API zum Dekodieren von h264-frames. Ich könnte Dekodieren und Rendern der frames in der Sicht. Mein problem ist der decoder verpassen, Vielzahl von frames,vor allem die ersten paar frames. DecodeMediaCodec.dequeueOutputBuffer() -1 zurück. aAbout 150 h264 frames,nur decodiert 43 frames. Ich kann nicht finden, wo das problem ist. Hier meine codes.
/**
* init decoder
*/
private void initDecodeMediaCodec()
{
mDecodeMediaCodec = MediaCodec.createDecoderByType(MIME_TYPE);
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE,
VIDEO_WIDTH_640,
VIDEO_HEIGHT_480);
mDecodeMediaCodec.configure(format,
new Surface(mRemoteVideoView.getSurfaceTexture()),
null,
0);
mDecodeMediaCodec.start();
mDecodeInputBuffers = mDecodeMediaCodec.getInputBuffers();
System.out.println("decode-----"
+ mDecodeMediaCodec.getCodecInfo().getName());
}
Nach dem ersten decoder werde ich aus der decoder-thread.
/**
*
* @param frameData
*/
private void decode()
{
new Thread(new Runnable()
{
@Override
public void run()
{
while (true)
{
ByteBuffer decodeDataBuffer = null;
try
{
//take h264 frame from cache queue
decodeDataBuffer = decodeDataQuene.take();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
BufferInfo info = new BufferInfo();
int inputBufferIndex = mDecodeMediaCodec.dequeueInputBuffer(-1);
System.out.println("inputBufferIndex: " + inputBufferIndex);
if (inputBufferIndex >= 0)
{
ByteBuffer buffer = mDecodeInputBuffers[inputBufferIndex];
buffer.clear();
buffer.put(decodeDataBuffer.array());
mDecodeMediaCodec.queueInputBuffer(inputBufferIndex,
0,
decodeDataBuffer.array().length,
0,
0);
decodeDataBuffer.clear();
decodeDataBuffer = null;
}
int outputBufferIndex = mDecodeMediaCodec.dequeueOutputBuffer(info,
1000);
System.out.println("outputBufferIndex: "
+ outputBufferIndex);
do
{
if (outputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER)
{
//no output available yet
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
//encodeOutputBuffers = mDecodeMediaCodec.getOutputBuffers();
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
MediaFormat formats = mDecodeMediaCodec.getOutputFormat();
//mediaformat changed
}
else if (outputBufferIndex < 0)
{
//unexpected result from encoder.dequeueOutputBuffer
}
else
{
mDecodeMediaCodec.releaseOutputBuffer(outputBufferIndex,
true);
outputBufferIndex = mDecodeMediaCodec.dequeueOutputBuffer(info,
0);
System.out.println("inner outputBufferIndex: "
+ outputBufferIndex);
}
} while (outputBufferIndex > 0);
}
}
}).start();
}
Jemand weiß, warum?Ich hoffe, Ihre Hilfe.Mein android-Gerät nexus 7.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Immer -1 zurück von
MediaCodec#dequeueOutputBuffer()
normal ist. Es bedeutet nur, es muss nicht jeder Ausgang ist doch fertig.Es ist nicht so, dass Sie mit der hand
MediaCodec
einen Puffer für kodierte Daten und erhalten sofort eine entschlüsselte Puffer zurück. Sie Seite ist es ein Puffer, der Daten, die versandt wird, um diemediaserver
Prozess, der speist Sie in das hardware-AVC-decoder, der kann noch initialisieren oder vielleicht auch nur sich gerne auf ein paar frames. Wenn die Dekodierung der Prozess abgeschlossen ist, werden die dekodierten Daten übergeben bekommt Sie zurück durchmediaserver
zu Ihrer app verarbeiten.Der trick ist, die
queueInputBuffer()
Aufruf sofort zurückkehrt. Im normalen Betrieb der input-Seite des Decoders ausgeführt wird mehrere frames vor der output-Seite. Wenn Sie fertig sind Fütterung-Eingang legen Sie die end-of-stream-flag, und wenn Sie sehen, EOS eingestellt auf die Ausgabe, die Sie wissen, Sie haben das Ende erreicht.Finden Sie verschiedene Anwendungsbeispiele, die auf bigflake und in Grafika. Die DecodeEditEncodeTest und EncodeDecodeTest Beispiele arbeiten ausschließlich mit raw H. 264, die anderen nutzen
MediaExtractor
undMediaMuxer
zu handhaben MP4-Datei Wrapper.MediaFormat
oder senden Sie Sie als das erste Bild mit derCODEC_CONFIG
- flag gesetzt ist. Nicht beides. (3) ich glaube nicht, dass der codec zahlt keine Aufmerksamkeit auf die Punkte bei der Dekodierung. (Es wird wichtig bei der Codierung, obwohl.) Wenn Sie die Zeitstempel von der Quelle ist es eine gute Idee zu halten, Sie aber-z.B. im Fall, dass Ihre video-Quelle liefert nicht frames mit einer Konstanten rate.