当前位置: 首页 > 知识库问答 >
问题:

用于RTMP流媒体的MediaCodec编码器输出缓冲区的扩展客户端所有权

颛孙嘉玉
2023-03-14

背景:

我已经将Android的MediaCodec连接到FFmpeg,以对MediaMuxer不支持的各种格式进行多路复用,包括通过输出的rtmp://。flv集装箱。这种流媒体多路复用器需要对MediaCodec的输出缓冲区拥有更长、不可预测的所有权,因为它们可能在任何数据包处理步骤上执行网络I/O。对于我的视频流,我使用为Surface输入配置的MediaCodec。为了将多路复用与编码分离,我通过处理程序将MediaCodec的字节缓冲输出缓冲区排队到多路复用器。

如果我对进行多路复用,所有功能都会非常出色。flv输出到文件,而不是rtmpendpoint。

问题:

当muxing到rtmp://...endpoint我注意到我的流媒体应用程序在调用eglSwapBuffers(mEGLDisplay,mEncodingEGLSurface)atdequeueOutputBuffer()时开始阻塞,

避免复制MediaCodec#dequeueOutputBuffers返回的所有编码器输出并立即调用releaseOutputBuffer(…)的任何技巧

我的项目的完整来源可以在Github上找到。具体请参见:

  • Androidncoder。java:在音频和视频编码器之间共享行为的抽象编码器类:主要是drainEncoder()。将数据写入Muxer实例

Systrace

这是一些systrace输出流式传输720p@2Mbps视频到Z编码器。

解决了

复制然后在MediaCodec编码器输出ByteBuffers可用时立即释放它们可以解决问题而不会显着影响性能。我在ArrayDeque中回收ByteBuffer副本


共有1个答案

公良飞尘
2023-03-14

不幸的是,大多数Android手机不支持这种用例。MediaCodec只是编解码器供应商在设备上使用的OMX IL API的抽象。供应商编解码器对给定配置需要一定的审进量和输出缓冲区。

虽然从理论上讲,有一个输出缓冲区与编码器排队应该就足够了,但很多时候这是供应商编解码器不支持的,因为这会导致较低的编码性能;因此编解码器暂停。这在输入缓冲区中更为普遍。

应用程序无法控制为MediaCodec实例分配的输入/输出缓冲区的数量——Android会尝试分配所需的最小缓冲区数量,以节省内存。因此,您唯一的选择是复制输出缓冲区。虽然这并不理想,但编码的缓冲区往往相当小。

 类似资料:
  • 我正在尝试将来自麦克风的音频流编码为3gpp(AMR-NB)。问题是输出缓冲区包含奇怪的数据。代码和输出如下: 创建媒体编码器: 来自MIC的PCM数据似乎是正确的(存储到文件中,使用Audacy监听) 读取编码字节(缓冲区,在线程中运行): 结果是: 我谷歌了一下,没有找到任何帮助。使用MediaCodec的Android文档并不出色,在输出缓冲区上下文中使用ByteBuffer.clear()

  • 我有很多PDF文件,我需要得到它的内容编码使用Base64。我有一个Akka应用程序,它以流的形式获取文件,并分发给许多工人来编码这些文件,并为每个文件返回字符串base64。我得到了一个编码的基本解决方案: 它工作,但我想知道什么将是最好的方式,我可以使用缓冲区编码文件,如果有一个更快的替代这一点。 我测试了一些其他方法,例如: null 任何投入都是很有帮助的。谢谢你!

  • 大小范围在2.5MB-20MB之间。这个问题在较长的剪辑上变得更糟,例如7分钟的范围是9MB-120MB。 正常吗? 我试图捕捉同样的场景,但还是得到了不同的结果。

  • 我想用不同的比特率和分辨率对MPEG-DASH的实时流进行编码,以便实时播放。 到目前为止,我发现的一切要么只使用源分辨率(灵活,nginx rtmp模块),要么似乎只用于VOD流媒体(DASHEncoder)。 是否可以将DASHEncoder与实时输入(rtmp流)一起使用,我将如何做到这一点?如果没有,是否可以将nginx-rtmp ffmpeg用于我想做的事情?

  • 在简介一节中我们提到,客户端层暴露了一个供人类使用的用户界面。 客户端由两部分组成:一个只读的简单 HTML 页面和一个可交互的单页 JavaScript 应用。两者都从 JSON API 读取数据。 路由 论坛所有的默认路由都在 Flarum\Forum\ForumServiceProvider 中注册。每个路由有一个对应的 Action (动作)类, 这个类本质上就是控制器。每个动作接受一个

  • 今天早些时候很无聊,我开始思考Java中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了一个相当大的文本文件,并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四项测试: 使用无缓冲的输入和输出字节流复制文件 毫不奇怪,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我来说)是案例2和案例3之间的速度差异。部分样本结果如下: 对于那些感兴趣的人,可以