Android 4.3 jelly bean 输入为表面的媒体编解码器API不适用于H264编码器(bigflake示例代码)

Android 4.3 jelly bean 输入为表面的媒体编解码器API不适用于H264编码器(bigflake示例代码),android-4.3-jelly-bean,android-mediacodec,muxer,Android 4.3 Jelly Bean,Android Mediacodec,Muxer,我正在尝试运行4.3版本中带有H264编码器的媒体编解码器API的示例代码,在下面的bigflake链接中进行了解释 我面临以下问题。 ->在H264编码器代码中,颜色格式、高度和宽度没有得到更新,因为getpatameter实现中存在问题。所以我应用了这个补丁()。 ->应用补丁后,编码器也不编码 ->我见过这样的观察 D/CameraToMpegTest(3421):编码器输出格式更改:{csd-1=java.nio.ByteArrayBuffer[position=0,limit=8,c

我正在尝试运行4.3版本中带有H264编码器的媒体编解码器API的示例代码,在下面的bigflake链接中进行了解释

我面临以下问题。 ->在H264编码器代码中,颜色格式、高度和宽度没有得到更新,因为getpatameter实现中存在问题。所以我应用了这个补丁()。 ->应用补丁后,编码器也不编码 ->我见过这样的观察 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\u重试\u稍后。 因此,它创建了文件,但没有对任何内容进行编码,它会停止

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

在Android 4.3中,“编码器输出格式更改”消息是正常的。这就是编码器如何为您提供带有csd-0/csd-1键的
MediaFormat
,这是
MediaMuxer#addTrack()
所需的

Bug 58834用于VP8软件编码器;硬件AVC编解码器不需要这些补丁

INFO\u请稍后再试
最常见的原因是缺少输入。编码器可能会在生成任何输出之前将相当数量的输入帧排队,因此您不能只提交一帧,然后等待输出出现。打开
VERBOSE
标志,确保正在提交帧。

在Android 4.3中,“编码器输出格式已更改”消息是正常的。这就是编码器如何为您提供带有csd-0/csd-1键的
MediaFormat
,这是
MediaMuxer#addTrack()
所需的

Bug 58834用于VP8软件编码器;硬件AVC编解码器不需要这些补丁


INFO\u请稍后再试
最常见的原因是缺少输入。编码器可能会在生成任何输出之前将相当数量的输入帧排队,因此您不能只提交一帧,然后等待输出出现。打开
VERBOSE
标志,确保正在提交帧。

我已尝试在Android 4.3 emulator上运行CameraToMpegTest示例。正如您现在已经意识到的,它不会像现在这样工作,需要一些修复

  • 在SoftAVCEncoder中正确实现getparameter(对于MIME类型-“视频/avc”)的宽度、高度、颜色格式等参数。否则,您的MediaFormat配置不正确,createInputSurface将失败。(我不确定为什么在使用Mediarecorder运行H.264编码时这不会导致任何问题)

  • 修复EGL属性

  • 最重要的是,如果您试图在活动上下文中执行此代码,请确保不阻止onFrameAvailable回调 (最终无效连接() 阻止当前线程(Thread.currentThread()),直到接收器完成其执行并死亡。)


  • 我已经尝试在Android 4.3模拟器上运行CameraToMpegTest示例。正如您现在已经意识到的,它不会像现在这样工作,需要一些修复

  • 在SoftAVCEncoder中正确实现getparameter(对于MIME类型-“视频/avc”)的宽度、高度、颜色格式等参数。否则,您的MediaFormat配置不正确,createInputSurface将失败。(我不确定为什么在使用Mediarecorder运行H.264编码时这不会导致任何问题)

  • 修复EGL属性

  • 最重要的是,如果您试图在活动上下文中执行此代码,请确保不阻止onFrameAvailable回调 (最终无效连接() 阻止当前线程(Thread.currentThread()),直到接收器完成其执行并死亡。)


  • 作为代码片段,您应该删除
    th.join()


    它对我很有用。

    作为代码片段,您应该删除
    th.join()


    这对我来说很好。

    谢谢你提供的信息。然而,csd-0/csd-1消息显示的是衍射高度、宽度和比特率,而不是我们设置的。在这里,我也尝试软件AVC,所以你知道任何其他修复需要。关于帧队列,我将检查并向您通报。如果您有媒体编解码器的工作示例代码可以共享,那也太好了。bigflake.com上的代码是我的。编码器的大小和颜色格式在格式传递到
    configure()
    时设置;在该点之后更改
    MediaFormat
    对象不会产生任何效果。如果在调用
    MediaCodec#configure()
    之前立即记录格式,您将看到与稍后看到的相同的维度。您好,Fadeen,我正在Emulator上尝试此示例。在此,我粘贴了我的代码。我已经更改了egl参数,因为它不能直接在emulator上工作。但是,我可以看到来自摄影机的帧,但是onfrmaeavailable没有被调用…如果忽略这个事实,假设编码器有空帧可用,但它仍然没有编码…请查找下面的代码。我强烈建议使用物理设备处理媒体内容。我已经对EGL配置进行了更改。我还没有在模拟器上尝试过任何示例。谢谢您提供的信息。然而,惩教署
        /** 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;
            }
        }