Hello,
When I try the following command, I see no error:
gst-launch-1.0 uridecodebin uri=file:/home/Desktop/videos/1.mkv ! nvvideoconvert ! nvv4l2vp8enc ! rtpvp8pay ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=97 ! appsink
but if I try to use the pipeline into OpenCV I am getting errors:
code:
pipeline = “uridecodebin uri=file://home/Desktop/videos/1.mkv ! nvvideoconvert ! nvv4l2vp8enc ! rtpvp8pay ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=97 ! appsink”
vs = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
print(vs)
while True:
ret, frame = vs.read()
print(frame.shape)
if ret:
cv2.waitKey(1)
cv2.imwrite(“frame.jpg”, frame)
Error:
Opening in BLOCKING MODE
Opening in BLOCKING MODE
[ WARN:0] global /home/Desktop/JEP/script/workspace/opencv-4.5.0/modules/videoio/src/cap_gstreamer.cpp (1761) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module source reported: Resource not found.
[ WARN:0] global /home/Desktop/JEP/script/workspace/opencv-4.5.0/modules/videoio/src/cap_gstreamer.cpp (888) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global /home/Desktop/JEP/script/workspace/opencv-4.5.0/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
<VideoCapture 0x7fae6dbf50>
Traceback (most recent call last):
File “test.py”, line 10, in
print(frame.shape)
AttributeError: ‘NoneType’ object has no attribute ‘shape’
Hi @isaac-223 ,
We had a problem similar with your question before. We have upgraded OpenCV version to 4.1.1 and our problem was solved by doing that.
Best wishes.
The problem is that opencv videoCapture from gstreamer doesn’t support VP8 format (list). Usually it receives BGR for color video, such as:
vs = cv2.VideoCapture("uridecodebin uri=file://home/Desktop/videos/1.mkv ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink drop=1", cv2.CAP_GSTREAMER)
You may explain what is your case for better help.
@ozguryildiz I have recently installed OpenCV, its the latest one.
@Honey_Patouceul I tried the line of code above as…
gst-launch-1.0 uridecodebin uri=file://home/Desktop/videos/1.mkv ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! format=BGR ! appsink drop=1
and got the following output:
(gst-launch-1.0:11429): GStreamer-CRITICAL **: 20:46:35.641: gst_element_link_pads_filtered: assertion ‘GST_IS_BIN (parent)’ failed
WARNING: erroneous pipeline: syntax error
I want to be able to read any video file and extract frames from it to further pass it for detection and inference.
Sorry there was a typo in my command. I’ve corrected it.
Be aware that in gst-launch appsink will do nothing and may allocate more and more memory until you kill it.
@Honey_Patouceul Thank you so much. it worked!
Do we have any other alternative than appsink which would help in capturing frames from any video stream and is memory efficient at a same time?
appsink is what you need for reading output of a pipeline from an application such as your one with opencv. My warning was just about using it in gst-launch command. From opencv application there should be no memory issue.
For using with gst-launch, fakesink (a pure sink that does nothing) would a better alternative.
Alright! Thank you so much @Honey_Patouceul for your help and guidance I really appreciate that.