【发布时间】:2018-05-07 15:45:55
【问题描述】:
我知道 exoplayer 支持 RTSP,但我需要 C++ 代码可以在许多操作系统的播放器上运行,所以我需要在传递给 exoplayer 之前将 C++ 中的 RTP 数据包解析为 NAL 单元
我找到了decode RTP packets using live555 并提取其 NAL 单元的方法。根据ExoPlayer's documentation:
所有 ExoPlayer 实现共有的组件是:
定义要播放的媒体、加载媒体以及可以从中读取已加载媒体的 MediaSource。
MediaSource 是 在播放开始时通过 ExoPlayer.prepare 注入。 ...
所以我需要一个自定义的MediaSource,它可以从我的 C++ 代码中提取 NAL 单元。
在class reference for MediaSource,我们可以看到已经有一些MediaSources 可用。我虽然也许 SmoothStreaming MediaSource 可以工作,但没有描述它究竟做了什么,在它的构造函数中我必须提供一个 Uri 或一个 SsManifest (什么)。
我可以看到这个库中有一个NAL unit utility,所以也许事情已经完成了一半
那么如何构建或使用已经可用的 MediaSource 来读取 NAL 单元以供 ExoPlayer 播放?
作为补充,您如何将 NAL 单元从 C++ 传递到 Java?在代码中,我发现它只是将它们存储在 C++ 缓冲区中。我应该以某种方式在 Java 中读取这个缓冲区吗?
更新:
我一直在研究这个库的工作原理。这一切都始于MediaSource,其中包含Extractor 和DataSource 之类的对象。似乎ExtractorMediaSource 是MediaSource,您可以在其中提供自己的Extractor 和DataSource。
据我了解,DataSource 是一个从任何可能的地方获取原始字节的类,无论是文件读取还是网络数据包。基于库中可用的Extractor 类,如Mp4Extractor 和Mp3Extractor,Extractor 可以解释从DataSource 读取的数据。 Extractor 接口的两个主要方法是:
void init(ExtractorOutput output)
int read(ExtractorInput input, PositionHolder seekPosition)
我不知道ExtractorInput 和ExtractorInput 是干什么用的,但它们看起来很重要。
所以Extractor 不知何故从DataSource 读取,解析它并以通用格式发送到Renderer?
我需要知道这种通用格式是怎样的,这样我才能解析从自定义 DataSource 读取的 NAL 单元。
【问题讨论】:
标签: java android c++ video h.264