Android MediaCodec décoder le h264 raw
Je suis en utilisant Android MediaCodec API pour décoder le h264 images. J'ai pu décoder et de rendre les images sur la vue. Mon problème est le décodeur manquer beaucoup d'images,surtout la première, quelques images. DecodeMediaCodec.dequeueOutputBuffer() renvoie -1. à aabout 150 h264 images,juste décodé 43 images. Je ne trouve pas où est le problème. Voici mes 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());
}
Après décodeur initiale,je vais commencer décodeur fil.
/**
*
* @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();
}
Quelqu'un sait pourquoi?J'espère que votre aide.Mon appareil android nexus 7.
OriginalL'auteur Read Mark | 2014-01-17
Vous devez vous connecter pour publier un commentaire.
Arriver -1 retour de
MediaCodec#dequeueOutputBuffer()
est normal. Cela signifie simplement qu'il n'ont pas de sortie encore prêt.Ce n'est pas le cas, que vous la main
MediaCodec
un tampon de données codées et obtenez immédiatement un décodé de la mémoire tampon. Vous donnez une mémoire tampon de données, qui est envoyée à lamediaserver
processus, qui se nourrit dans le matériel AVC decoder, qui peut encore être en cours d'initialisation ou peut-être juste aime à s'asseoir sur quelques images. Lorsque le processus de décodage est terminée, les données décodées est passée en arrière à traversmediaserver
à votre application de processus.Le truc est, le
queueInputBuffer()
appel renvoie immédiatement. En fonctionnement normal, le côté de l'entrée du décodeur s'exécuter plusieurs images en avant de la sortie. Lorsque vous avez terminé d'alimentation d'entrée vous définissez la fin de flux pavillon, et quand vous voyez EOS ensemble sur la sortie que vous savez que vous avez atteint la fin.Vous pouvez trouver différents exemples de travail sur bigflake et dans Grafika. Le DecodeEditEncodeTest et EncodeDecodeTest exemples de travailler exclusivement avec des raw H. 264, les autres utilisent
MediaExtractor
etMediaMuxer
pour gérer les fichiers MP4 wrappers.(1) Vous pouvez peut-être gagner du temps par la configuration et le démarrage du décodeur à l'avance. Je n'ai pas expérimenté. Combien de retard voyez-vous? (2) Vous pouvez ajouter de la CDD à la
MediaFormat
ou de le présenter comme la première image avec laCODEC_CONFIG
drapeau. Ne pas faire les deux. (3) je ne pense pas que le codec paie toute l'attention à l'PTS lors du décodage. (est important lors de l'encodage.) Si vous avez le temps de timbres à partir de la source c'est une bonne idée de les garder si -- par exemple, dans le cas où votre source vidéo n'est pas de fournir des images à un taux constant.Le retard sur mon Nexus 7 est d'environ 19 images, et 6 images sur mon Samsung s3. Le dalay est relativement stable. Il semble avoir une relation avec le matériel ,mais je ne suis pas sûr.
avez-vous l'esprit d'avoir un coup d'oeil à ma question s'il vous plaît - stackoverflow.com/q/50817767/8199772
OriginalL'auteur fadden