Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
342 views
in Technique[技术] by (71.8m points)

opencv - Best way to diagnose VideoCapture not opening the rtmp stream

I am pulling my hair off for a few days and I'm out of ideas.

I have two rtmp streams

  • first stream is transcoded directly by myself (I use ffmpeg to transcode) and then I attach to that stream with opencv - VideoCapture can open the stream with no problem
  • second stream is transcoded by 3rd party system (this system captures video through WebRTC and then encodes to h264) - this stream cannot be opened by VideCapture no matter what I do

I can attach with pure ffmpeg to that dodgy stream and I can restream - but this is not ideal as introduces extra network traffic and latency.

I was playing with OPENCV_FFMPEG_CAPTURE_OPTIONS environmental variable (I was trying to remove audio stream, change the video codec, playing with rtmp options like this OPENCV_FFMPEG_CAPTURE_OPTIONS="loglevel;debug" python my_script.py) - no joy

So I figured I am trying to solve this problem from wrong end. I should somehow collect underlying ffmpeg logs that should be available when calling VideoCapture. So I tried to set OPENCV_FFMPEG_CAPTURE_OPTIONS="v;debug" but I can see no ffmpeg output when calling VideoCapture.

This is very simple python3 script I was using during tests:

import cv2 as cv
dodgy_cap = cv.VideoCapture()
dodgy_cap.open('rtmp://my_local_ip_address/rtmp/dodgy_stream_name')
print(dodgy_cap.isOpened())  # always returns False
healthy_cap = cv.VideoCapture()
healthy_cap.open('rtmp://my_local_ip_address/rtmp/healthy_stream_name')
print(healthy_cap.isOpened())  # always returns True

I collected information about both streams with ffprobe, but even though they look different I cannot see what would be the difference that prevents opencv from opening VideoCapture for dodgy stream..

This is a fragment from (very) verbose log for healthy stream:

RTMP_ClientPacket, received: notify 254 bytes                                                                                                                                                                                               
(object begin)                                                                                                                                                                                                                              
Property: <Name:           no-name., STRING:    onMetaData>                                                                                                                                                                                 
Property: <Name:           no-name., ECMA_ARRAY>                                                                                                                                                                                            
(object begin)                                                                                                                                                                                                                              
Property: <Name:           duration, NUMBER:    0.00>                                                                                                                                                                                       
Property: <Name:              width, NUMBER:    2048.00>                                                                                                                                                                                    
Property: <Name:             height, NUMBER:    1536.00>                                                                                                                                                                                    
Property: <Name:      videodatarate, NUMBER:    0.00>                                                                                                                                                                                       
Property: <Name:          framerate, NUMBER:    6.00>                                                                                                                                                                                       
Property: <Name:       videocodecid, NUMBER:    7.00>                                                                                                                                                                                       
Property: <Name:              title, STRING:    Session streamed by "preview">                                                                                                                                                              
Property: <Name:            comment, STRING:    h264Preview_01_main>                                                                                                                                                                        
Property: <Name:            encoder, STRING:    Lavf58.20.100>                                                                                                                                                                              
Property: <Name:           filesize, NUMBER:    0.00>                                                                                                                                                                                       
(object end)                                                                                                                                                                                                                                
(object end)                                                                                                                                                                                                                                
Metadata:
  duration              0.00
  width                 2048.00
  height                1536.00
  videodatarate         0.00
  framerate             6.00
  videocodecid          7.00
  title                 Session streamed by "preview"
  comment               h264Preview_01_main
  encoder               Lavf58.20.100
  filesize              0.00

(... raw network packets ...)

Input #0, flv, from 'rtmp://my_local_ip_address/rtmp/healthy_stream_name':
  Metadata:
    title           : Session streamed by "preview"
    comment         : h264Preview_01_main
    encoder         : Lavf58.20.100
  Duration: 00:00:00.00, start: 159.743000, bitrate: N/A
    Stream #0:0, 41, 1/1000: Video: h264 (High), 1 reference frame, yuv420p(progressive), 2048x1536, 0/1, 6 fps, 6 tbr, 1k tbn

And this is the fragment for dodgy stream:

RTMP_ClientPacket, received: notify 205 bytes                                                                                                                                                                                               
(object begin)                                                                                                                                                                                                                              
Property: <Name:           no-name., OBJECT>                                                                                                                                                                                                
(object begin)                                                                                                                                                                                                                              
Property: <Name:    metadatacreator, STRING:    Agora.io SDK>                                                                                                                                                                               
Property: <Name:            encoder, STRING:    Agora.io Encoder>                                                                                                                                                                           
Property: <Name:       audiocodecid, NUMBER:    10.00>                                                                                                                                                                                      
Property: <Name:    audiosamplesize, NUMBER:    16.00>                                                                                                                                                                                      
Property: <Name:             stereo, BOOLEAN:   FALSE>                                                                                                                                                                                      
Property: <Name:    audiosamplerate, NUMBER:    48000.00>                                                                                                                                                                                   
Property: <Name:       videocodecid, NUMBER:    7.00>                                                                                                                                                                                       
Property: <Name:              width, NUMBER:    640.00>                                                                                                                                                                                     
Property: <Name:             height, NUMBER:    480.00>                                                                                                                                                                                     
(object end)                                                                                                                                                                                                                                
(object end)                                                                                                                                                                                                                                
RTMP_ReadPacket: fd=3                                                                                                                                                                                                                       

(... raw network packets ...)

Input #0, flv, from 'rtmp://my_local_ip_address/rtmp/dodgy_stream_name':
  Duration: N/A, start: 4511.449000, bitrate: N/A
    Stream #0:0, 41, 1/1000: Video: h264 (High), 1 reference frame, yuv420p(progressive, left), 640x480, 0/1, 15.17 fps, 15.08 tbr, 1k tbn, 30 tbc
    Stream #0:1, 124, 1/1000: Audio: aac (LC), 48000 Hz, mono, fltp

Both streams don't require any authentication (they are not exposed to the outside world)

Dodgy stream contains audio but I don't think it is source of problem as I was able to connect to other healthy rtmp streams that contained audio..

I have no more ideas how can I debug this problem, please help..


I found in VideoCap documentation that I can enable exception mode, however it did not help much (it says where it failed but it does not say why):

>>> dodgy_stream = cv.VideoCapture()
>>> dodgy_stream.setExceptionMode(True)
>>> dodgy_stream.open("rtmp://my_local_ip_address/rtmp/dodgy_stream_name")
Traceback (most recent call las

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...