繁体   English   中英

如何使用iOS8的VideoToolbox解码live555 rtsp流(h.264)MediaSink数据?

[英]How to decode a live555 rtsp stream (h.264) MediaSink data using iOS8's VideoToolbox?

好的,我知道这个问题与get-rtsp-stream-from-live555-and-decode-with-avfoundation几乎相同,但是现在用于iOS8的VideoToolbox公开使用,虽然我知道它可以用这个来完成框架,我不知道如何做到这一点。

我的目标是:

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

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

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

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

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

  • gstreamer:与上述相同

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

我做的。 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);

现在,困难的部分(因为我在视频节目小白):用一个4字节长度的代码替换NALunit标题描述这里

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 ...我使用这个堆栈溢出线程作为参考。

最后,按照如何将UIImage数组导出为电影所述的说明保存在UIImage转换的流数据

我刚刚发布了一些我的代码,因为我认为这是重要的部分,换句话说,它是我遇到问题的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM