我知道exoplayer支持RTSP,但是我需要在许多操作系统的播放器上都能使用的C++代码,因此在传递给exoplayer之前,我需要先将C++中的RTP数据包解析为NAL单元
我找到了一种方法decode RTP packets using live555并提取其NAL单元。根据ExoPlayer's documentation:
因此,我需要一个自定义的MediaSource
,可以从我的C++代码中提取NAL单元。
在class reference for MediaSource处,我们可以看到已经有一些MediaSource
可用。我虽然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
接口(interface)的两个主要方法是:
void init(ExtractorOutput output)
int read(ExtractorInput input, PositionHolder seekPosition)
我不知道ExtractorInput
和ExtractorInput
是什么,但它们看起来很重要。因此,以某种方式
Extractor
从DataSource
读取,解析它并以通用格式发送给Renderer?我需要知道这种常见格式如何,以便可以解析从自定义
DataSource
读取的NAL单位。 最佳答案
您无法使用ExoPlayer播放NAL单元或原始H.264流。图片数据必须存在于supported container/format中。
目前尚不清楚您神秘的C++代码在做什么,是否是NDK设置?它在Android解码中起什么作用?您是在说无法从[C++函数]将数据数组传递给某些Android函数作为函数参数吗?是这样的Java to C++ setup吗?目前尚不清楚您的真正问题是...
如果您坚持使用Exoplayer,我可以告诉您FLV是(在容器列表上)可能是最好的选择,因为它可以实时构建(重新混合)。您首先创建一个FLV header ,其中包含SPS
和PPS
数据,然后是关键帧(从第一个NAL中提取的H264数据)。您必须熟悉FLV字节结构,但是每个帧头大约为13个字节,后跟NAL数据,对每个帧重复直到结束。这将是实时代码转换。
作为第二种选择,对于Android,您可以仅使用 MediaCodec
解码从NAL单元提取的H264。这是一个useful example source。只需用作:
MediaCodec.createDecoderByType("video/avc"); //then later give NAL units
还可以研究其他source的功能,以了解如何通过Android自己的解码器工作。
其他起点: