簡體   English   中英

在Ubuntu上使用OpenCV的ffmpeg解碼h264(High)流

[英]Decoding a h264 (High) stream with OpenCV's ffmpeg on Ubuntu

我正在使用來自Ubuntu 14.04上的IP攝像機的視頻流。 具有以下參數的相機(來自FFMPEG)一切都很好:

    Stream #0:0: Video: h264 (Main), yuv420p(progressive), 352x192, 29.97 tbr, 90k tbn, 180k tbc

但是后來我換成了更新的相機,它具有以下參數:

    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x720, 25 fps, 25 tbr, 90k tbn, 50 tbc

我的C ++程序使用OpenCV3處理流。 默認情況下,OpenCV使用ffmpeg來解碼和顯示具有VideoCapture功能的流。

VideoCapture vc;
vc.open(input_stream);
while ((vc >> frame), !frame.empty()) {
   *do work*
}

使用新的相機流,我會收到以下類似錯誤(來自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

圖像有時會出現故障,有時會完全凍結。 但是在vlc上,它的播放效果非常好 我安裝了ffmpeg播放器的最新版本(3.2.2)

./configure --enable-gpl --enable-libx264

現在直接使用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

不能更改相機硬件。 可以將相機設置為編碼為h265或mjpeg。 編碼為mjpeg時,它可以輸出5 fps,這還不夠。 解碼為靜態視頻也不是一種選擇,因為我需要顯示有關流的實時結果。 是可以在功能VideoCapture中使用的API后端的列表。 也許我應該切換到其他解碼器和播放器? 根據我的研究,我得出以下結論:

  • 以某種方式使OpenCV使用libVlc而不是ffmpeg

這里是切換到vlc的一個示例,但是我對它的理解還不夠,無法說出我是否需要它。 還是我應該在代碼中解析流?

  • 使用VLC來預處理流,如建議在這里

這可能很慢,這又不利於實時結果。
任何建議和評論將不勝感激。

由於默認情況下使用RTP,因此錯誤是由數據包丟失引起的。 您現在看到了更多錯誤,因為您已切換到更高的比特率輸入。

?tcp附加到您的輸入,例如。 rtsp://*private*/media/video2?tcp在OpenCV的open功能中可以強制TCP, rtsp://*private*/media/video2?tcp是您的硬件和/或使用情況支持該功能。

我已經基本解決了這個問題。

  • 首先,我使用必要的設置將ffmpeg的最新版本手動安裝在設備上,重新編譯了OpenCV。
  • 我使用VLC 工具 > 編解碼器信息檢查了流,以檢查流是否有損壞的幀,沒有。
  • 我降低了流分辨率。 這帶來了最大的改進。
  • 我仍然留下的最后一個錯誤是

    [NULL @ 0x7f834c008c00] SEI類型25大小896被截斷為320 = 1/1
    [h264 @ 0x7f834c0d5d20] SEI類型25大小896被截斷為319 = 1/1

但它不會明顯損壞框架。 但是,我尚未解決流凍結問題,但這與我的代碼有關,而不與軟件有關。 如果我可以幫助任何有類似問題的人,請隨時詢問其他信息。

經過4天的研究最終我遇到了同樣的問題,我通過以下代碼輕松解決了這個問題:

for(;;) {
        if(!vcap.read(image)) {
            std::cout << "No frame" << std::endl;
            cv::waitKey();
        }
        cv::imshow("Output Window", image);
        if(cv::waitKey(1) >= 0) break;
    }   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM