我试图将MediaCodec作为h264流的解码器。我甚至无法让MediaCodec将它的调用传递给start()而不会崩溃。MediaCodec在启动时崩溃()
以下是日志。基本上我的SurfaceView.Holder回调发生在表面被创建和改变时。在surfaceChanged上我启动了一个线程,它试图启动一个MediaCodec。
的_surface实例是surfaceChanged(SurfaceHolder.getSurface())
String key_mime = "video/avc";
int w = 480;
int h = 360;
MediaFormat mediaFormat = MediaFormat.createVideoFormat(key_mime, w, h);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 2000000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 25);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
try
{
decoder = MediaCodec.createDecoderByType(key_mime);
}
catch (IOException e)
{
e.printStackTrace();
return;
}
decoder.configure(mediaFormat, _surface, null, 0);
decoder.start();
登录:
05-05 13:18:14.645 22393-22393/ca.example.app D/StreamActivity﹕ surfaceCreated()
05-05 13:18:14.645 22393-22393/ca.example.app D/StreamActivity﹕ surfaceChanged([email protected], 4, 1368, 765
05-05 13:18:14.655 22393-22586/ca.example.app I/ACodec﹕ [] Now uninitialized
05-05 13:18:14.655 22393-22588/ca.example.app I/OMXClient﹕ Using client-side OMX mux.
05-05 13:18:14.685 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] Now Loaded
05-05 13:18:14.685 22393-22588/ca.example.app E/ACodec﹕ onConfigureComponent mime.c_str() = video/avc
05-05 13:18:14.685 22393-22588/ca.example.app E/ACodec﹕ [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
05-05 13:18:14.685 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] DRC Mode: Port Reconfig Mode
05-05 13:18:14.685 22393-22588/ca.example.app W/ACodec﹕ do not know color format 0x7fa30c03 = 2141391875
05-05 13:18:14.735 22393-22588/ca.example.app I/ExtendedCodec﹕ Decoder will be in frame by frame mode
05-05 13:18:14.735 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] OMX_QCOM_FramePacking_OnlyOneCompleteFrame is setting
05-05 13:18:14.765 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] Now Loaded->Idle
05-05 13:18:14.795 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] configureOutputBuffersFromNativeWindow setBufferCount : 22, minUndequeuedBuffers : 4
05-05 13:18:14.795 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] Allocating 22 buffers from a native window of size 294912 on output port
05-05 13:18:14.805 22393-22588/ca.example.app E/ACodec﹕ dequeueBuffer failed: Invalid argument (22)
05-05 13:18:14.805 22393-22588/ca.example.app E/ACodec﹕ Failed to allocate buffers after transitioning to IDLE state (error 0xffffffea)
05-05 13:18:14.805 22393-22588/ca.example.app E/ACodec﹕ signalError(omxError 0x80001001, internalError -22)
05-05 13:18:14.805 22393-22588/ca.example.app I/ACodec﹕ [OMX.qcom.video.decoder.avc] Now Loaded
05-05 13:18:14.805 22393-22587/ca.example.app E/MediaCodec﹕ Codec reported err 0xffffffea, actionCode 0, while in state 5
05-05 13:18:14.805 22393-22586/ca.example.app E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2272
Process: ca.example.app, PID: 22393
android.media.MediaCodec$CodecException: start failed
at android.media.MediaCodec.native_start(Native Method)
at android.media.MediaCodec.start(MediaCodec.java:612)
at ca.example.app.StreamActivity$StreamingVideoThread.run(StreamActivity.java:975)
at java.lang.Thread.run(Thread.java:818)
我测试主要是对三星Galaxy S4是在安卓5.0.1。我有一种感觉这个设备不支持MediaCodec?
UPDATE
如果我删除所有的mediaFormat.setInteger调用,则媒体编解码器启动正常。由于我的h264流具有每隔'n'帧的SPS/PPS信息,所以媒体编解码器也开心地工作。定时信息关闭,它正在播放视频方式来快速,但这是一个不同的问题。
上述配置如何适用于samsung s4?有没有关于三星的任何文件? – Ajit