我正在尝试运行带有H264 Encoder的Media Codec API的示例代码,在以下的bigflake链接中进行了解释
http://bigflake.com/mediacodec/CameraToMpegTest.java.txt
我遇到了以下问题。 - >在H264编码器代码中,颜色格式,高度和宽度没有得到更新,因为getpatameter实现中存在问题。所以我应用了这个补丁(https://code.google.com/p/android/issues/detail?id=58834)。 - >应用补丁后,编码器也不编码 - >我看过像这样的观察 D / CameraToMpegTest(3421):编码器输出格式已更改:{csd-1 = java.nio.ByteArrayBuffer [position = 0,limit = 8,capacity = 8],height = 144,mime = video / avc,csd-0 = java.nio.ByteArrayBuffer [position = 0,limit = 12,capacity = 12],what = 1869968451,width = 176}
为什么这个价值会发生变化,不知道...... 之后我们总是看到编码器将queueOutputBuffer的状态设置为INFO_TRY_AGAIN_LATER。 所以它创建了文件,但它没有编码任何东西,它停止为
I / MPEG4Writer(3421):接收总/ 0长度(0/0)缓冲区并编码0帧。 - 视频
D / MPEG4Writer(3421):停止视频轨道
D / MPEG4Writer(3421):停止视频轨道源
D / MPEG4Writer(3421):视频轨道已停止
D / MPEG4Writer(3421):停止编写器线程
D / MPEG4Writer(3421):在最后一批中写入0个块
D / MPEG4Writer(3421):写入程序线程已停止
所以在我的理解中它应该可以工作,但看起来仍然编码器没有正确配置...
请指导一下...... 感谢
Nehal
答案 0 :(得分:2)
Android 4.3中的“编码器输出格式已更改”消息正常。这就是编码器为MediaFormat
提供MediaMuxer#addTrack()
csd-0 / csd-1密钥的方法,INFO_TRY_AGAIN_LATER
。
Bug 58834用于VP8软件编码器;硬件AVC编解码器不应该需要这些补丁。
VERBOSE
最常见的原因是缺乏输入。编码器可能会在产生任何输出之前排队相当数量的输入帧,因此您不能只提交一帧然后等待输出出现。打开{{1}}标志,确保正在提交框架。
答案 1 :(得分:1)
我尝试在Android 4.3模拟器上运行CameraToMpegTest示例。正如你现在已经意识到的那样,它不会按原样运行,并且需要一些修复。
在SoftAVCEncoder中正确实现getparameter(如果是MIME类型 - “video / avc”),请参阅宽度,高度,颜色格式等参数。否则,您的MediaFormat配置不正确,createInputSurface将失败。 (我不确定为什么在使用Mediarecorder运行H.264编码时不会出现任何问题)
修复EGL属性
最重要的是,如果您尝试在Activity上下文中执行此代码,请确保不要阻止onFrameAvailable回调 (final void join() 阻止当前Thread(Thread.currentThread())直到接收者完成执行并死亡。)
答案 2 :(得分:0)
作为代码段,您应该删除th.join();
/** Entry point. */
public static void runTest(CameraToMpegTest obj) throws Throwable {
CameraToMpegWrapper wrapper = new CameraToMpegWrapper(obj);
Thread th = new Thread(wrapper, "codec test");
th.start();
// th.join();
if (wrapper.mThrowable != null) {
throw wrapper.mThrowable;
}
}
它适用于我。