从RTMP流中实时提取帧作为图像

时间:2014-02-02 18:21:08

标签: ffmpeg video-streaming red5 rtmp wowza

我正在使用生成FLV文件的RTMP将以不同客户端的VGA质量以15 fps编码的H264编码的短视频(4或5秒)从服务器流式传输到服务器。我需要尽快将视频中的帧分析为图像,因此我需要在收到帧时将帧写为PNG图像。

目前我使用Wowza接收流,我尝试使用代码转换器API访问各个帧并将其写入PNG。这部分工作但在转码器开始处理之前有大约第二个延迟,当流结束时Wowza刷新其缓冲区导致最后一秒不进行转码,这意味着我可能丢失最后25%的视频帧。我试图找到一种解决方法但Wowza say that it is not possible to prevent the buffer getting flushed。它也不是理想的解决方案,因为在我开始获取帧之前有1秒的延迟,并且在使用代码转换器时我必须重新编码视频,这对于我的需求来说是计算上昂贵且不必要的。

我还尝试将视频实时传输到FFmpeg并让它生成PNG图像但不幸的是它等到它在生成PNG帧之前收到整个视频。

如何从流中提取尽可能接近实时的所有帧?我不介意使用什么语言或技术,只要它可以在Linux服务器上运行。我很乐意使用FFmpeg,如果我能找到一种方法让它在仍然接收视频时写入图像,甚至是Wowza,如果我能找到一种不丢帧而不重新编码的方法。

感谢您提供任何帮助或建议。

3 个答案:

答案 0 :(得分:2)

由于你从red5用户列表中链接了这个问题,我将加上我的两分钱。您当然可以在服务器端抓取视频帧,但是您遇到的问题是从h.264转码为PNG。最简单的方法是在获取VideoData对象后使用ffmpeg / avconv。这是一篇帖子,提供了有关获取VideoData的一些详细信息:http://red5.5842.n7.nabble.com/Snapshot-Image-from-VideoData-td44603.html 另一种选择是使用Dan Rossi的FlowPlayer插件之一在玩家方面:http://flowplayer.electroteque.org/snapshot

答案 1 :(得分:1)

我终于找到了用FFmpeg做到这一点的方法。诀窍是禁用音频,使用不同的flv元数据分析器并减少FFmpeg在处理之前等待的持续时间。我的FFmpeg命令现在开始如下:

ffmpeg -an -flv_metadata 1 -analyzeduration 1 ...

这开始在接收来自管道的输入的一秒内产生帧,因此将流帧写得非常接近实时。

答案 2 :(得分:1)

我遇到了同样的问题。我通过不同的方法(使用javacv,ffmpeg)解决了这个问题,也许你想知道或尝试。

http://www.mekya.com/2014/11/07/how-to-extract-snapsot-image-from-rtmp-streams-videodata-in-red5-app/