Android MediaCodec解码h264原始数据延迟问题

Android MediaCodec解码h264原始数据延迟问题,android,decode,android-mediacodec,Android,Decode,Android Mediacodec,我曾尝试使用MediaCodec对1080pH264原始数据进行解码。 但是我发现我的索尼Z3(5.1.1)的延迟在45毫秒到65毫秒之间。 是否可以减少延迟? 我的帧是IPPP,GOP是15,是否有h264 sps标志会影响延迟 我还有一个问题,如何改变曲面的方向,让框架以90180度或270度显示 我把我的测试项目源代码放在下面的GoogleDrive链接中。 h264原始数据位于测试代码\res\raw中 02-16 18:05:52.804:I/进程(10590):发送信号。PID:1

我曾尝试使用MediaCodec对1080pH264原始数据进行解码。 但是我发现我的索尼Z3(5.1.1)的延迟在45毫秒到65毫秒之间。 是否可以减少延迟? 我的帧是IPPP,GOP是15,是否有h264 sps标志会影响延迟

我还有一个问题,如何改变曲面的方向,让框架以90180度或270度显示

我把我的测试项目源代码放在下面的GoogleDrive链接中。 h264原始数据位于测试代码\res\raw中

02-16 18:05:52.804:I/进程(10590):发送信号。PID:10590信号:9
02-16 18:05:54.618:W/ResourceType(10706):找到多个库表,忽略。。。
02-16 18:05:54.677:D/OpenGLRenderer(10706):使用EGL交换行为保存:true
02-16 18:05:54.684:D/地图集(10706):验证地图。。。
02-16 18:05:54.717:I/Adreno EGL(10706)::EGL 1.4高通公司版本:AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.01.00.042.030_msm8974_LA.BF.1.1.1_RB1_发布版
02-16 18:05:54.717:I/Adreno EGL(10706):OpenGL ES着色器编译器版本:E031.25.03.06
02-16 18:05:54.717:I/Adreno EGL(10706):建造日期:2015年7月13日星期一
02-16 18:05:54.717:I/Adreno EGL(10706):本地分行:mybranch11906725
02-16 18:05:54.717:I/Adreno EGL(10706):远程分支:quic/LA.BF.1.1_rb1.26
02-16 18:05:54.717:I/Adreno EGL(10706):局部斑块:无
02-16 18:05:54.717:I/Adreno EGL(10706):重构分支:AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.01.00.042.030+6151be1+a1e0343+002d7d6+7d0e3f7+NOTHING
02-16 18:05:54.718:I/OpenGLRenderer(10706):初始化EGL,版本1.4
02-16 18:05:54.733:D/OpenGLRenderer(10706):启用调试模式0
02-16 18:05:54.800:I/Timeline(10706):Timeline:Activity\u idle id:android.os。BinderProxy@1970952c时间:27341192
02-16 18:05:56.804:I/OMXClient(10706):使用客户端OMX mux。
02-16 18:05:56.819:D/MediaCodec(10706):MediaCodec[kWhatConfigure]:视频输出保护:00000000,音频输出保护:00000000
02-16 18:05:56.821:I/ACodec(10706):[OMX.qcom.video.decoder.avc]DRC模式:动态缓冲模式
02-16 18:05:56.827:I/ExtendedCodec(10706):解码器将处于逐帧模式
02-16 18:05:56.830:D/ACodec(10706):找到设置为00000000的视频输出保护标志
02-16 18:05:56.845:E/(10706):输入缓冲区。大小:4
02-16 18:05:56.845:E/(10706):输出缓冲区。大小:23
02-16 18:05:56.858:E/DecodeActivity(10706):出列输出缓冲区超时!
02-16 18:05:56.870:E/DecodeActivity(10706):出列输出缓冲区超时!
02-16 18:05:56.883:E/DecodeActivity(10706):出列输出缓冲区超时!
02-16 18:05:56.884:E/解码活动(10706):信息输出缓冲区更改
02-16 18:05:56.892:E/DecodeActivity(10706):新格式{mime=video/raw,裁剪顶部=0,裁剪右侧=1919,切片高度=1088,颜色格式=2141391876,高度=1088,宽度=1920,what=1869968451,裁剪底部=1079,裁剪左侧=0,跨步=1920}
02-16 18:05:56.898:E/decode活动(10706):51毫秒后接收第一个解码帧

我在您的代码中看到,您将10000 uS设置为接收输入数据的超时。时间很短

while (!Thread.interrupted()) {
            if (!isEOS) {
                int inIndex = decoder.dequeueInputBuffer(10000);
dequeueInputBuffer
中,放置一个很长的超时,如10秒(10000000)。这将允许更长的等待时间。将-1设置为超时将阻止,直到收到数据


您可能应该在馈送循环之外处理连接问题,并在启动馈送循环之前让自己的助手缓冲初始数据。

我在您的代码中看到,您将10000 uS设置为接收输入数据的超时。时间很短

while (!Thread.interrupted()) {
            if (!isEOS) {
                int inIndex = decoder.dequeueInputBuffer(10000);
dequeueInputBuffer
中,放置一个很长的超时,如10秒(10000000)。这将允许更长的等待时间。将-1设置为超时将阻止,直到收到数据


您可能应该在馈送循环之外处理连接问题,并在启动馈送循环之前让您自己的助手缓冲初始数据。

可能相关:嗨,fadden,我以前检查过问题线程。似乎MediaCodec需要输入一些帧,然后开始解码。但我想在流媒体直播中使用MediaCodec,我无法快速输入初始帧。所以我加上一个问题,也许有人和我面临同样的问题。也许他们有一些技巧可以减少延迟。你解决了吗?可能相关:嗨,法登,我以前检查过问题线程。似乎MediaCodec需要输入一些帧,然后开始解码。但我想在流媒体直播中使用MediaCodec,我无法快速输入初始帧。所以我加上一个问题,也许有人和我面临同样的问题。也许他们有一些技巧可以减少延迟。你解决了吗?嗨,莱昂,我认为扩大超时不能缩短延迟。它将在很长一段时间内阻止此函数中的线程。这更多是关于您对Fadden的评论:您说“我无法快速输入初始帧”。此设置与其说是延迟,不如说是超时,因此如果您的设备比此超时设置快,则不会改变任何内容。不过,1080P似乎是一个需要处理的巨大输入。无论如何,这似乎与解码时减少延迟的问题非常相似。如果问题只是第一帧,那么我也帮不上忙,因为我不太了解MediaCodec的微优化,它已经非常出色了。好的,谢谢你的回复。您知道如何更改曲面的方向吗?我想展示不同程度的框架。这取决于你如何设计你的应用程序。您是否使用OpenGLES和着色器?如果是这样,请搜索如何使用顶点着色器旋转结果。不,我没有在这种情况下使用OpenGL。我直接将MediaCodec结果输出到surface。嗨,Leon,我认为扩大超时不能缩短延迟。它将在很长一段时间内阻止此函数中的线程。这更多是关于您对Fadden的评论:您说“我无法快速输入初始帧”。此设置与其说是延迟,不如说是超时,因此如果您的设备比