我知道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可以工作,但是没有确切说明它的功能,并且在其构造函数中,我必须提供UriSsManifest(什么)。
我可以看到该库中存在一个NAL unit utility,所以也许事情已经完成了一半
那么,如何构建或使用现有的MediaSource来读取NAL单元以供ExoPlayer播放?
另外,您如何将NAL单元从C++传递给Java?在我发现的代码中,它只是将它们存储在C++缓冲区中。我应该以某种方式在Java中读取此缓冲区吗?
更新:
我一直在研究该库的工作方式。这一切都以MediaSource开头,该对象具有ExtractorDataSource之类的对象。好像ExtractorMediaSourceMediaSource,您可以在其中提供自己的ExtractorDataSource
据我了解,DataSource是一个从任何可能的位置获取原始字节的类,无论是文件读取还是网络数据包。根据库中可用的Extractor类(例如Mp4ExtractorMp3Extractor),Extractor是将解释从DataSource读取的数据的东西。 Extractor接口(interface)的两个主要方法是:

void init(ExtractorOutput output)
int read(ExtractorInput input, PositionHolder seekPosition)
我不知道ExtractorInputExtractorInput是什么,但它们看起来很重要。
因此,以某种方式ExtractorDataSource读取,解析它并以通用格式发送给Renderer
我需要知道这种常见格式如何,以便可以解析从自定义DataSource读取的NAL单位。

最佳答案

您无法使用ExoPlayer播放NAL单元或原始H.264流。图片数据必须存在于supported container/format中。

目前尚不清楚您神秘的C++代码在做什么,是否是NDK设置?它在Android解码中起什么作用?您是在说无法从[C++函数]将数据数组传递给某些Android函数作为函数参数吗?是这样的Java to C++ setup吗?目前尚不清楚您的真正问题是...

如果您坚持使用Exoplayer,我可以告诉您FLV是(在容器列表上)可能是最好的选择,因为它可以实时构建(重新混合)。您首先创建一个FLV header ,其中包含SPSPPS数据,然后是关键帧(从第一个NAL中提取的H264数据)。您必须熟悉FLV字节结构,但是每个帧头大约为13个字节,后跟NAL数据,对每个帧重复直到结束。这将是实时代码转换。

作为第二种选择,对于Android,您可以仅使用 MediaCodec 解码从NAL单元提取的H264。这是一个useful example source。只需用作:

MediaCodec.createDecoderByType("video/avc"); //then later give NAL units

还可以研究其他source的功能,以了解如何通过Android自己的解码器工作。

其他起点:
  • Android Decode raw h264 stream with MediaCodec(NAL units)
  • Decode H264 raw stream using mediacodec
  • 07-24 09:25