我正在尝试运行复制视频流的 Gstreamer 管道,以便它可以在两个应用程序中使用。这是我的示例管道,在 Jetson Nano 上运行时失败,但在我的 Ubuntu PC 上运行。
我使用 from selenium import webdriver
import urllib.request
from PIL import Image
import os
keyword=input('keyword : ')
n=150
url=input('url : ')
# provide path to dircetory before running the code
path='E://Old//cust_data'
if keyword not in os.listdir(path):
os.mkdir(path+'//'+keyword)
img_dir=path+'//'+keyword
driver=webdriver.Chrome('E://Old//card//chromedriver.exe')
driver.get(url)
i=1
j=1
while j<=n:
try:
driver.find_element_by_xpath('//*[@id="islrg"]/div[1]/div[{}]/a[1]/div[1]/img'.format(i)).click()
img=driver.find_element_by_xpath('//*[@id="Sva75c"]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div/div[2]/a/img')
link=img.get_attribute('src')
print(link)
urllib.request.urlretrieve(link,img_dir+'//'+keyword+' '+str(j)+'.jpg')
size=os.stat(img_dir+'//'+keyword+' '+str(j)+'.jpg').st_size
if size<15000:
os.remove(img_dir+'//'+keyword+' '+str(j)+'.jpg')
else:
im=Image.open(img_dir+'//'+keyword+' '+str(j)+'.jpg')
print(keyword+' '+str(j)+'.jpg',(im.size[0],im.size[1]))
j+=1
i+=1
except:
i+=1
print('error')
pass
driver.close()
创建了 2 个 v4l2 设备(/dev/video1 和 /dev/video2),如下所示:
v4l2loopback
制作人:
sudo modprobe v4l2loopback video_nr=1,2
消费者:
gst-launch-1.0 videotestsrc ! tee name=t ! queue ! v4l2sink device=/dev/video1 t. ! queue ! v4l2sink device=/dev/video2
如您所见,我正在尝试使用 gst-launch-1.0 v4l2src device=/dev/video2 ! xvimagesink
复制流并将其发送到我使用 v4l2loopback 创建的 2 个 tee
设备。
当我运行消费者时,它显示第一帧,然后崩溃:
v4l2
知道为什么无法分配缓冲区吗?为什么这不会发生在我的 Ubuntu PC 上?
这是我的完整 Jetson Nano 管道,它使用相机并将流拆分为 2 个 v4l2 接收器:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Failed to allocate a buffer
Additional debug info:
gstv4l2src.c(998): gst_v4l2src_create (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0
Execution ended after 0:00:00.056466348
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
答案 0 :(得分:0)
使用 max_buffers=2
中的 v4l2loopback
参数可以消除错误。我无法解释为什么它在我的 Ubuntu PC 上不需要这个选项,一定与可用内存量有关吗?
奇怪的是,将 max_buffers
增加到更高的值(例如 max_buffers=8
)会导致 same Failed to allocation buffer 错误。