c++ - 如何将 Opencv VideoWriter 与 GStreamer 一起使用?
问题描述
我正在尝试使用 Opencv VideoWriter 传输 h264 流,以使用 VideoCapture 在网络上的另一台电脑上获取它。但是,我被困在 VideoWriter 上。执行此代码会返回错误,并且 out.isOpened () 始终为 false。
int FOURCC = cv::VideoWriter::fourcc('H', '2', '6', '4');
cv::VideoWriter out;
out.open ("appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000",
cv::CAP_GSTREAMER,
FOURCC,
16,
cv::Size (640, 480),
true);
if (!out.isOpened ()) {
qDebug () << "\ n ***** Failed to open videowriter *****";
return -1;
}
[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1274) cv::CvVideoWriter_GStreamer::close_ OpenCV | GStreamer warning: No source in GStreamer pipeline. Ignore
[ERROR:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap.cpp (527) cv::VideoWriter::open VIDEOIO(GSTREAMER): raised OpenCV exception:
OpenCV(4.3.0) D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp:144: error: (-215:Assertion failed) ptr in function 'cv::`anonymous-namespace'::GSafePtr<struct _GstElement>::get'
***** Failed open videowriter *****
即使是一个简单的例子也会给我一个错误并且 out.isOpened() 错误。
out.open("autovideosrc ! videoconvert ! appsink",
cv::CAP_GSTREAMER,
FOURCC,
16,
cv::Size(640, 480),
true);
[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1500) cv::CvVideoWriter_GStreamer::open OpenCV | GStreamer warning: OpenCV backend does not support this file type (extension): autovideosrc ! videoconvert ! appsink
[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1274) cv::CvVideoWriter_GStreamer::close_ OpenCV | GStreamer warning: No source in GStreamer pipeline. Ignore
***** Failed to open videowriter *****
opencv 4.3.0 的版本是从源代码编译的,支持 gstreamer。cv::getBuildInformation () 说:
Video I/O:
DC1394: NO
FFMPEG: YES (prebuilt binaries)
avcodec: YES (58.54.100)
avformat: YES (58.29.100)
avutil: YES (56.31.100)
swscale: YES (5.5.100)
avresample: YES (4.0.0)
GStreamer: YES (1.16.2)
DirectShow: YES
Media Foundation: YES
DXVA: YES
如何流式传输流?VideoWriter应该指定哪些参数?我尝试了谷歌的各种提示,但没有一个对我有帮助。我会很感激一个简单的例子,说明如何从一侧的 VideoWriter 发送流并从另一侧的 VideoCapture 接收它。我正在使用 Windows 10 x64 和 Qt5.13 MSVC2017
解决方案
您需要将原始视频提供给appsrc
. 设置fourcc
为h264
强制VideoWriter
编码视频而不是 gstreamer 管道。您可以将您的设置fourcc
为 0 以推送原始视频。以下应该工作。
cv::VideoWriter out;
out.open ("appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000",
cv::CAP_GSTREAMER,
0,
16,
cv::Size (640, 480),
true);
推荐阅读
- scala - 向火花数据框添加一列,其中包含当前行的所有列名列表,其值不为空
- c# - 以最小的质量损失将图像调整为最小尺寸
- jsf - 如何将天、月或年添加到 Primefaces 日历输入
- css - Sass:@use 出错,未定义变量
- python - python,努力绘制CSV文件
- python-3.x - 执行 sqlite 查询时的 Unittest Flask 上下文错误
- android - 此 NavController 不知道导航目的地?
- laravel - Laravel 控制器功能运行两次
- safari - Safari WebRTC 错误...“无法设置远程报价 sdp:会话错误代码:ERROR_CONTENT。会话错误描述:
- uno-platform - 如何部署 Uno Web 程序集应用程序