1

我的 iOS 应用程序是一个从监控摄像头流式传输视频的播放器。有两种流模式:HTTP 和 RTP/RTSP。


HTTP:

 媒体容器:MPEG-2 TS

 视频编解码器:H.264 (MPEG-4 AVC)

 音频编解码器:AAC

RTP/RTSP:

 媒体容器:MPEG4

 视频编解码器:H.264 (MPEG-4 AVC)

 音频编解码器:AAC


在 HTTP 模式下,我可以使用 MPMoviePlayerViewController 成功播放。

RTP/RTSP模式下,我使用Live555实现RTP/RTSP协议。我们刚刚从流媒体中获取数据并存储到温度文件中,例如 DATA.MP4。我们不使用 ffmpeg 解码数据,因为许可证。

我使用 MPMoviePlayerViewController 播放 DATA.MP4 文件,但它不能。如上信息,HTTP和RTP/RTSP具有相同的视频配置文件H.264,所以我想知道为什么MPMoviePlayerViewController不能播放DATA.MP4?

顺便说一句,我正在尝试使用 OpenH264(Cisco) 来解码 DATA.MP4,但我不知道如何使用这个库。因为它不是关于它的更多文件。谁有这方面的经验,可以分享一些样品吗?

谢谢!

4

1 回答 1

0

您可以使用 openRTSP 将 RTSP 流保存到 mp4,它还提供了如何执行此操作的源代码示例。http://www.live555.com/openRTSP/

我已经设法使用 openh264 解码 RTSP 流,但有一些事情需要注意。有关概述,请参阅http://www.live555.com/liveMedia/faq.html#testRTSPClient-how-to-decode-data 。

  • 从 MediaSink 派生一个新类
  • 有关 openh264 解码器 API 的概述,请参阅https://github.com/cisco/openh264/wiki/UsageExampleForDecoder
  • 在初始化 h264 解码器之前,需要从 subsession 中获取一些参数: string spropParams = subsession->fmtp_spropparametersets(); 并将其传递给您的接收器对象。
  • 在解码期间,接收器的 AfterGettingFrame 方法被重复调用。每次传入一个H264“NAL帧”,要么是一个H264帧片段,要么是一组H264参数。
  • 每个帧在发送到解码器之前都需要一个起始码 0x00000001 附加到缓冲区。有关如何完成此操作的示例,请参见 H264or5VideoFileSink.cpp(在 live555 源中)。https://github.com/xanview/live555/blob/master/liveMedia/H264or5VideoFileSink.cpp
  • sprop 参数应该在发送任何其他数据之前传输到解码器。也请参阅 H264or5VideoFileSink.cpp。
  • 使用 openh264 中的 DecodeFrameNoDelay(用于立即显示多片数据)或 DecodeFrame2(用于仅显示完整帧)功能进行解码https://github.com/cisco/openh264/wiki/ISVCDecoder#decodeframenodelay
  • 帧仅在 sDstBufInfo.iBufferStatus 为真时准备好
  • 帧通常在一些非 RGB 颜色空间中编码,例如 I420。解决这个问题的一种方法是 opencv 的 cvtColor 和 COLOR_YUV2BGR_I420 选项。
  • 当 RTSP 在 UDP 上工作时,我遇到了一些帧无法解码的问题(我遇到了 dsRefLost 错误)。这可能是由于某些帧大于网络的 MTU,导致丢包。一种解决方法是使用 TCP 代替 RTSP 或简单地增加网络 MTU。https://ffmpeg.org/pipermail/libav-user/2011-November/000901.html

我希望这会有所帮助!

于 2017-03-12T08:57:15.387 回答