我正在使用生成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,如果我能找到一种不丢帧而不重新编码的方法。
感谢您提供任何帮助或建议。
答案 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)解决了这个问题,也许你想知道或尝试。