Android-Software-Decoder (OMX.google.h264.decoder) nicht Dekodieren von H264-Videos
Bin ich auf Probleme, wenn Sie versuchen, zu extrahieren und Dekodieren von H264-Videos mit Androiden software-decoder (OMX.google.h264.decoder). Das Problem scheint sich über mehrere Geräte.
In diesem video ist die Wiedergabe gut mit einer Nexus-5-hardware-decoder (OMX.qcom.video.- decoder.avc).
Der Beispielcode unten zeigt das Problem und ist ein ziemlich standard-Beispiel für die Verwendung der android MediaCodec und MediaExtractor Klassen.
Die exception die ich bekomme, ist ein illegaler Staat-Ausnahme, wenn der erste Puffer wird an den decoder.
Das video ist 720 x 480 20fps codiert an das Baseline-Profil, so treffen sollte, Verträglichkeit Richtlinien.
Hier ist ein video-Beispiel zum begleiten der code
Ich würde mich sehr über eine Anleitung, wie die software-video-decoder richtig arbeitet mit H264-video.
public void doMp4Test()
{
try
{
//String filename = "webserver_h264.mp4";
String filename = "toodee-720p.mp4";
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(Constants.RootDirectory + File.separator + filename);
MediaCodec decoder = null;
for (int i = 0; i < extractor.getTrackCount(); i++)
{
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/"))
{
extractor.selectTrack(i);
decoder = MediaCodec.createByCodecName("OMX.google.h264.decoder");
//decoder = MediaCodec.createDecoderByType("OMX.qcom.video.decoder.avc"); //working decoder type
decoder.configure(format, m_surface, null, 0);
break;
}
}
if (decoder == null)
{
Log.e("DecodeActivity", "Can't find video info!");
return;
}
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
BufferInfo info = new BufferInfo();
boolean isEOS = false;
long startMs = System.currentTimeMillis();
while (!Thread.interrupted())
{
if (!isEOS)
{
int inIndex = decoder.dequeueInputBuffer(10000);
if (inIndex >= 0)
{
ByteBuffer buffer = inputBuffers[inIndex];
int sampleSize = extractor.readSampleData(buffer, 0);
if (sampleSize < 0)
{
Log.d("DecodeActivity", "InputBuffer BUFFER_FLAG_END_OF_STREAM");
decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
isEOS = true;
}
else
{
int flags = 0;//extractor.getSampleFlags();
decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), flags);
extractor.advance();
}
}
}
int outIndex = decoder.dequeueOutputBuffer(info, 10000);
switch (outIndex)
{
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");
outputBuffers = decoder.getOutputBuffers();
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
Log.d("DecodeActivity", "New format " + decoder.getOutputFormat());
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
Log.d("DecodeActivity", "dequeueOutputBuffer timed out!");
break;
default:
ByteBuffer buffer = outputBuffers[outIndex];
Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer);
//We use a very simple clock to keep the video FPS, or the
//video
//playback will be too fast
while (info.presentationTimeUs / 1000 > System.currentTimeMillis() - startMs)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
break;
}
}
decoder.releaseOutputBuffer(outIndex, true);
break;
}
if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0)
{
Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");
break;
}
}
decoder.stop();
decoder.release();
extractor.release();
}
catch (Exception e)
{
e.printStackTrace();
}
}
InformationsquelleAutor Michael David Knight | 2015-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suche das video mit ffprobe wie es aussieht ist es tatsächlich high-Profil eher als Basis-Profil:
Nebenbei, das video zu spielen scheint, sondern nur zeigen einen schwarzen leeren Bildschirm angezeigt, wenn die Wiedergabe über ein paar Browser, wenn ich versuchte es auf einem laptop.
Diesen link hat ein "h".264 mp4-video, dass sollte funktionieren - habe es gerade getestet auf Android 4.2 und es spielte wieder mit dem Android-browser und den chrome-browser: quirksmode.org/html5/tests/video.html
InformationsquelleAutor Mick