Gstreamer 元素未链接

1 gstreamer

我是 Gstreamer 新手,我有一个关于为什么我的元素无法链接在一起的问题。这是我的代码:

CustomData data;

data.videosource = gst_element_factory_make("uridecodebin", "source");
cout << "Created source element " << data.videosource << endl;
data.demuxer = gst_element_factory_make("qtdemux", "demuxer");
cout << "Created demux element " << data.demuxer << endl;
data.decoder = gst_element_factory_make("ffdec_h264", "video-decoder");
cout << "Went to the video path " << data.decoder << endl;          
data.videoconvert = gst_element_factory_make("ffmpegcolorspace", "convert"); 
cout << "Created convert element " << data.videoconvert << endl;
data.videosink = gst_element_factory_make("autovideosink", "sink");
cout << "Created sink element " << data.videosink << endl;

if (!data.videosource ||!data.demuxer || !data.decoder || !data.videoconvert || !data.videosink)
{
    g_printerr ("Not all elements could be created.\n");
    system("PAUSE");
    return;
}

//Creating the pipeline
data.pipeline = gst_pipeline_new("video-pipeline");
if (!data.pipeline)
{
    g_printerr ("Pipeline could not be created.");
}


//Setting up the object
g_object_set(data.videosource, "uri", videoFileName[camID] , NULL);
//videoFileName[camID] is a char** with the content uri=file:///C://videofiles/...mp4


//Adding elements to the pipeline
gst_bin_add_many(GST_BIN (data.pipeline), data.videosource, data.demuxer, data.decoder, data.videoconvert, data.videosink, NULL);
//This is where the issue occurs
   if(!gst_element_link(data.videosource, data.demuxer)){
        g_printerr("Elements could not be linked. \n");
        system("PAUSE");
        return;
}
Run Code Online (Sandbox Code Playgroud)

我想做的是分解 mp4 文件并仅显示视频内容,但由于某种原因,当我尝试链接源和解复用器时,它显示为 false。

非常感谢你们!

mre*_*hub 5

让我们看一下您正在使用的管道(gst-launch为了简洁起见,我将在此处使用它,但这同样适用于任何 GStreamer 管道):

gst-launch uridecodebin uri=file:///path/to/movie.avi \
   ! qtdemux ! ffdec_h264 ! ffmpegcolorspace \
   ! autovideosink
Run Code Online (Sandbox Code Playgroud)

gst-inspect uridecodebinstates:
自动插入 URI 并将其解码为原始媒体

因此,uridecodebin可以获取任何音频/视频源并通过内部使用 GStreamer 的一些其他元素对其进行解码。
它的输出类似于video/x-raw-rgbaudio/x-raw-int(原始音频/视频)

qtdemux另一方面,获取 QuickTime 流(仍然编码)并将其解复用。

但它在您的示例中得到的是已经解码的原始视频(这就是它不会链接的原因)。

所以,你基本上有两个选择:

  • 只需使用uridecodebin

    gst-launch uridecodebin uri=file:///path/to/movie.avi \
       ! autovideosink
    
    Run Code Online (Sandbox Code Playgroud)

    这将允许您的管道解码几乎任何视频文件

  • 只需使用以下qtdemux ! ffdec_h264 ! ffmpegcolorspace元素:

    gst-launch filesrc=/path/to/movie.avi \
       ! qtdemux ! ffdec_h264 ! ffmpegcolorspace
       ! autovideosink
    
    Run Code Online (Sandbox Code Playgroud)

但请记住,您的管道不播放音频。
为此,请执行以下操作之一:

  • 只需使用playbin2

    gst-launch playbin2 uri=file:///path/to/movie.avi
    
    Run Code Online (Sandbox Code Playgroud)
  • 还将您连接decodebin到音频接收器 gst-launch uridecodebin name=d uri=... !自动视频接收器 D. !汽车音响接收器