【问题标题】:How to decode a live555 rtsp stream (h.264) MediaSink data using iOS8's VideoToolbox?如何使用 iOS8 的 VideoToolbox 解码 live555 rtsp 流 (h.264) MediaSink 数据?
【发布时间】:2015-05-11 17:44:38
【问题描述】:

好的,我知道这个问题和get-rtsp-stream-from-live555-and-decode-with-avfoundation几乎一样,但是现在iOS8的VideoToolbox已经公开使用了,虽然我知道可以使用这个框架来完成,但我不知道该怎么做.

我的目标是:

  • 使用 rtsp 协议连接 WiFiCamera 并接收流数据(使用 live555 完成)
  • 将数据解码并转换为 UIImages 以显示在屏幕上(类似motionJPEG)
  • 并将流数据保存在 .mov 文件中

我使用 ffmpeg 实现了所有这些目标,但不幸的是,由于我公司的政策,我无法使用它。

我知道我也可以使用 openGL 在屏幕上显示,但这次我必须转换为 UIImages。我还尝试使用以下库:

  • ffmpeg:由于公司的政策,不能使用这个时间。 (别问我为什么)

  • libVLC:显示滞后约 2 秒,我无权访问流数据以保存到 .mov 文件中...

  • gstreamer:同上

我相信 live555 + VideoToolbox 会完成这项工作,只是无法弄清楚如何做到这一点......

【问题讨论】:

    标签: ios decode h.264 rtsp live555


    【解决方案1】:

    我做到了。 VideoToolbox 的文档仍然很差,而且我们没有太多关于视频编程的信息(不使用 ffmpeg),所以它花费的时间比我真正预期的要多。

    对于使用 live555 的流,我获得了 SPS 和 PPS 信息来创建 CMVideoFormatDescription,如下所示:

    const uint8_t *props[] = {[spsData bytes], [ppsData bytes]};
    size_t sizes[] = {[spsData length], [ppsData length]};
    
    OSStatus result = CMVideoFormatDescriptionCreateFromH264ParameterSets(NULL, 2, props, sizes, 4, &videoFormat);
    

    现在,困难的部分(因为我是视频编程的菜鸟):将 NALunit 标头替换为 4 字节长度的代码,如 here 所述

    int headerEnd = 23; //where the real data starts
    uint32_t hSize = (uint32_t)([rawData length] - headerEnd - 4);
    uint32_t bigEndianSize = CFSwapInt32HostToBig(hSize);
    NSMutableData *videoData = [NSMutableData dataWithBytes:&bigEndianSize length:sizeof(bigEndianSize)];
    
    [videoData appendData:[rawData subdataWithRange:NSMakeRange(headerEnd + 4, [rawData length] - headerEnd - 4)]];
    

    现在我能够使用此原始数据成功创建 CMBlockBuffer 并将缓冲区传递给 VTDecompressionSessionDecodeFrame。从这里很容易将响应CVImageBufferRef 转换为UIImage...我使用this stack overflow thread 作为参考。

    最后,按照How do I export UIImage array as a movie?上的说明保存UIImage上转换的流数据

    我只是发布了一点我的代码,因为我相信这是重要的部分,或者换句话说,这是我遇到问题的地方。

    【讨论】:

    • 什么是stripPositionaData
    • 抱歉,当我在此处复制/粘贴此代码时,我决定更改一些变量名称以更好地理解上下文...忘记更改其中一些...现在我修复了示例代码.希望对你有帮助。
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2015-11-24
    • 2015-09-05
    • 2011-08-11
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多