我正在设计一个管道,将来自 opencv 应用程序(从网络摄像头获取)的视频帧编码为 video/x-h264 格式,通过网络发送并在另一台不同类型的设备(可能是树莓派)上将其解码到适合我的项目的 RGB 流。
为此,我应该使用硬件加速编码器和解码器。
由于整个场景非常庞大,当前的开发是在 Intel 机器上使用 gstreamer VAAPI 插件(vaapiencode_h264 和 vaapidecode)进行的。而且,我们不需要使用任何网络插件,如 TCPServer 或 UDPServer
为此,我使用了以下管道来达到我的目的:
在编码器端:
appsrc name=applicationSource ! videoconvert ! video/x-raw, format=I420, width=640, height=480,framerate=30/1, pixel-aspect-ratio=1/1,interlace-mode=progressive ! vaapiencode_h264 bitrate=600 tune=high-compression ! h264parse config-interval=1 ! appsink name=applicationSink sync=false
Appsrc 部分工作得很好,而 appsink 部分则有一些问题。
该管道的 appsink 部分已设置以下上限:
“视频/x-h264,格式=(字符串){avc,avc3,字节流},对齐=(字符串){au,nal};视频/mpeg,mpeg版本=(int)2,配置文件=(字符串)简单”
我的appsink的数据提取代码是
bool HWEncoder::grabData()
{
// initial checks..
if (!cameraPipeline)
{
GST_ERROR("ERROR AS TO NO PIPE FOUND ... Stopping FRAME GRAB HERE !! ");
return false;
}
if (gst_app_sink_is_eos (GST_APP_SINK(applicationSink)))
{
GST_WARNING("APP SINK GAVE US AN EOS! BAILING OUT ");
return false;
}
if (sample)
{
cout << "sample available ... unrefing it ! "<< endl;
gst_sample_unref(sample);
}
sample = gst_app_sink_pull_sample (GST_APP_SINK(applicationSink));
if (!sample)
{
GST_WARNING("No valid sample");
return false; // no valid sample pulled !
}
sink_buffer = gst_sample_get_buffer(sample);
if (!sink_buffer)
{
GST_ERROR("No Valid Buffer ");return false;
}
return true;
}
打开管道并检查应用程序接收器中的缓冲区填充后,我无限期地陷入了下面所说的代码行:
sample = gst_app_sink_pull_sample (GST_APP_SINK(applicationSink));
我有以下问题:
1)我的appsink Caps正确吗?如果不是,我如何确定它们的上限?
2)我上面的管道有问题吗?
如何使用 Appsink 解决此问题?
任何形式的帮助都会很有用!
谢谢 !!