如何通过Live555播放数据帧?

时间:2014-06-05 04:20:25

标签: ios ipad h.264 live555

我的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(思科)解码DATA.MP4,但我不知道如何使用这个库。因为它不是关于它的更多文档。 任何有相关经验的人,您能与我分享一些样品吗?

谢谢!

1 个答案:

答案 0 :(得分: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参数传输到解码器。请参阅H264或5VideoFileSink.cpp。
  • 使用DecodeFrameNoDelay(用于立即显示多切片数据)或DecodeFrame2(仅用于显示完整帧)功能在openh264中进行解码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

我希望有所帮助!