arv*_*ids 6 video opencv ffmpeg rtsp h.264
我在Ubuntu 14.04上使用来自ip camera的视频流.使用具有这些参数的相机(来自FFMPEG),一切都很顺利:
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 352x192, 29.97 tbr, 90k tbn, 180k tbc
Run Code Online (Sandbox Code Playgroud)
但后来我改为更新的相机,它有以下参数:
Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x720, 25 fps, 25 tbr, 90k tbn, 50 tbc
Run Code Online (Sandbox Code Playgroud)
我的C++程序使用OpenCV3来处理流.默认情况下,OpenCV使用ffmpeg解码并显示具有VideoCapture功能的流.
VideoCapture vc;
vc.open(input_stream);
while ((vc >> frame), !frame.empty()) {
*do work*
}
Run Code Online (Sandbox Code Playgroud)
使用新的相机流我会得到这样的错误(来自ffmpeg):
[h264 @ 0x7c6980] cabac decode of qscale diff failed at 41 38
[h264 @ 0x7c6980] error while decoding MB 41 38, bytestream (3572)
[h264 @ 0x7c6980] left block unavailable for requested intra mode at 0 44
[h264 @ 0x7bc2c0] SEI type 25 truncated at 208
Run Code Online (Sandbox Code Playgroud)
图像有时会出现故障,有时会完全冻结.但是在vlc上它完美播放.我安装了ffmpeg播放器的最新版本(3.2.2)
./configure --enable-gpl --enable-libx264
Run Code Online (Sandbox Code Playgroud)
现在直接使用ffplay(而不是使用OpenCV函数VideoCapture从源代码启动),流播放效果更好,但有时仍会显示警告:
[NULL @ 0x7f834c008c00] SEI type 25 size 896 truncated at 320=1/1
[h264 @ 0x7f834c0d5d20] SEI type 25 size 896 truncated at 319=1/1
[rtsp @ 0x7f834c0008c0] max delay reached. need to consume packet
[rtsp @ 0x7f834c0008c0] RTP: missed 1 packets
[h264 @ 0x7f834c094740] concealing 675 DC, 675 AC, 675 MV errors in P frame
Run Code Online (Sandbox Code Playgroud)
更换相机硬件不是一种选择.可以将相机设置为编码为h265或mjpeg.当编码为mjpeg时,它可以输出5 fps,这还不够.解码为静态视频也不是一种选择,因为我需要显示有关流的实时结果.以下是可在VideoCapture函数中使用的API后端列表.也许我应该切换到其他解码器和播放器?根据我的研究,我得出结论,我有以下选择:
切换到vlc的一个例子就在这里,但我不太清楚它是否足以说明这是否是我需要的.或许我应该在代码中解析流?
这可能很慢,这对实时结果来说也是坏事.
任何建议和评论将不胜感激.
我已经基本解决了这个问题。
我仍然剩下的最后一个错误是
[NULL @ 0x7f834c008c00] SEI 类型 25 大小 896 在 320=1/1 处截断
[h264 @ 0x7f834c0d5d20] SEI 类型 25 大小 896 在 319=1/1 处截断
但它不会明显损坏框架。然而,我还没有解决流冻结问题,但这与我的代码有关,而不是软件。如果我可以帮助任何有类似问题的人,请随时询问更多信息。
归档时间: |
|
查看次数: |
4616 次 |
最近记录: |