This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:GStreamer 编码问题

Guru**** 2582405 points
Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/613166/linux-am5728-gstreamer-encode-problem

器件型号:AM5728

工具/软件:Linux

您好!

我想使用 gstreamer 对视频文件进行编码、我 的代码如下:

#include 

int main (int argc、char * argv[])
{
GstElement *管道、* src、*视频_解析、* myvpe、*编码、 *SINK、*capsfilter1;
GstCaps *caps1;
GstBus *总线;
GstMessage *msg;
GstStateChangeReturn;
GST_init (&argc、&argv);
流水线= GST_P管线_NEW ("videocoder");
src = GST_ELECK_factory_make ("filesrc"、 "src");
VIDEO_PART= GST_ELECK_factory_make ("videoparse"、"video_parse");
myvpe = GST_ELECK_factory_make ("video"、"myvepe");
capsfilter1 = gst_el元_factory_make ("capsfilter"、"capsfilter1");
enc = gst_el元_factory_make ("ducatih264enc、"con");
sink = gst_el元_factory_make ("filesink"、 "接收器");

if (!pipeline ||!src ||!video_parse ||!myvpe ||!capsfilter1||!enc ||!sink)
{
g_printerr ("无法创建一个元素。正在退出。\n");
return -1;
}
g_object_set (G_object (src)、"位置"、"/mnt/akiyo_qcif.yuv null);
g_object_set (G_object (video_parse)、"width"、"176"、NULL);
G_object_set (G_object (video_parse)、"高度"、"144"、NULL);
G_object_set (G_object (video_parse)、 "format"、2、NULL);
g_object_set (g_object (video_parse)、"framerate"、 25、1、NULL);
caps1 = gst_caps_new_Simple ("video/x-rain"、
"format"、G_type_string、 "NV12"、
"宽度"、G_TYPE_INT、176、
"高度"、 G_TYPE_INT、144、
"帧速率"、GST_TYPE_FRATE、25、 1、
NULL);
g_object_set (G_object (capsfilter1)、"caps"、cap1、 null);
GST_OBJECT_UNREF (caps1);
g_OBJECT_SET (G_OBJECT (SINK)、"位置"、"/mnt/b2b.h264、 null);
gst_bin_add_many (gst_bin (pipeline)、src、video_parse、myvpe、 capsfilter1、enc、sink、NULL);
if (gst_element_link_many (src、 video_parse、myvpe、capsfilter1、enc、sink)!= true)
{
g_printerr ("元素无法链接。\n");
gst_object_pref (流水线);
return -1;
}
ret= gst_elie_set_state (流水线、

unable _state_playing);if (gstgst_stop_state_state_gst = gstop_gstate_gst)





;gstop_time_message_gstage_time_time_tune_stop_gst (gst = gst);gstop_time_time_gstop_gstipe_time_tune_time_tune_stel_r_r_gst (gst = gstel_time_gst = gst (gst);gst

if (msg!= NULL)
gst_message_UNREF (msg);
gst_object_UNREF (bus);
gst_element_set_state (流水线、gst_state_NULL);
gst_object_UNREF (流水线);
返回0;
} 

然后、我运行此代码。它 遇到了一个问题:

(GST-TEST:1185):glib-GObject-Critical **:G_object_UNREF:断言"G_is_object (object)"失败

无法链接元素。

但是、我使用相同的流水线、命令行 成功:

gst-launch-1.0文件 rc location=/mnt/akiyo_qcif.yuv ! 视频粗宽度=176高度=144格式=i420 ! 视频转换! 'video/x-raw、format=(string) NV12、framerate=(fraction) 25/1、width=(int) 176、height=(int) 144' ! ducatih264enc!  文件链接位置=x.264 

那么、您能告诉我如何处理这个问题吗。谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我将检查代码并返回给您。
    还可以添加调试日志--gst-debug=2吗?

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    抱歉,我不知道如何在代码中添加一个函数来输出日志。我知道我可以添加“-- gst-debug=2"在我的命令行前获取调试日志。但是,我的问题是,同一个流水线可以使用命令行将 I420视频编码到 h264中,并且我以代码的形式创建了相同的流水线。最后,它失败并输出消息:(Gst-test:1185):glib-gobject-critical **:g_object_unref: 断言"G_is_object (object)"失败。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的建议,我尝试了:./GST 测试--GST 调试=2,capsfilter*:6,并输出:
    0:00:00.084635141 1252 0x13c780调试 capsfilter gstcapsfilter.c:213:gst_capsfilter_set_property: 设置新的 cap video /x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1

    (GST-TEST:1252):glib-GObject-Critical **:G_object_UNREF:断言"G_is_object (object)"失败
    0:00:00.085345507 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: 任何
    0:00:00.085386824 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.085420821 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x- raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.085477917 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.085586579 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: 任何
    0:00:00.085621064 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.085651808 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、帧速率=(fraction) 25/1
    0:00:00.085703861 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.085843267 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: VIDEO /x-RAW、format=(string) NV12、width=(int)[ 1、2147483647 ]、height=(int)[ 1、 2147483647]、帧速率=(小数)[0/1、2147483647/1];VIDEO/x-RAW、format=(string) YUV、 width=(int)[1、2147483647]、height=(int)[1、2147483647]、帧速率=(分数)[0/1、 2147483647/1]; video/x-raw、format=(string) YUY2、width=(int)[ 1、2147483647]、 height=(int)[ 1、2147483647]、帧速率=(分数)[ 0/1、2147483647/1]
    0:00:00.085935987 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.085966731 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、帧速率=(fraction) 25/1
    0:00:00.086018459 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.086158189 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: VIDEO /x-RAW、format=(string) NV12、width=(int)[ 1、2147483647 ]、height=(int)[ 1、 2147483647]、帧速率=(小数)[0/1、2147483647/1];VIDEO/x-RAW、format=(string) YUV、 width=(int)[1、2147483647]、height=(int)[1、2147483647]、帧速率=(分数)[0/1、 2147483647/1]; video/x-raw、format=(string) YUY2、width=(int)[ 1、2147483647]、 height=(int)[ 1、2147483647]、帧速率=(分数)[ 0/1、2147483647/1]
    0:00:00.086244077 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.436301279 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、帧速率=(fraction) 25/1
    0:00:00.4362442 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.436513396 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: VIDEO /x-RAW、format=(string) NV12、width=(int)[ 1、2147483647 ]、height=(int)[ 1、 2147483647]、帧速率=(小数)[0/1、2147483647/1];VIDEO/x-RAW、format=(string) YUV、 width=(int)[1、2147483647]、height=(int)[1、2147483647]、帧速率=(分数)[0/1、 2147483647/1]; video/x-raw、format=(string) YUY2、width=(int)[ 1、2147483647]、 height=(int)[ 1、2147483647]、帧速率=(分数)[ 0/1、2147483647/1]
    0:00:00.436592290 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.436619618 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、帧速率=(fraction) 25/1
    0:00:00.436662562 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    0:00:00.436860527 1252 0x13c780调试 capsfilter gstcapsfilter.c:297:gst_capsfilter_transform_cap: 输入: VIDEO /x-RAW、format=(string) NV12、width=(int)[ 1、2147483647 ]、height=(int)[ 1、 2147483647]、帧速率=(小数)[0/1、2147483647/1];VIDEO/x-RAW、format=(string) YUV、 width=(int)[1、2147483647]、height=(int)[1、2147483647]、帧速率=(分数)[0/1、 2147483647/1]; video/x-raw、format=(string) YUY2、width=(int)[ 1、2147483647]、 height=(int)[ 1、2147483647]、帧速率=(分数)[ 0/1、2147483647/1]
    0:00:00.436940071 1252 0x13c780调试 capsfilter gstcapsfilter.c:298:gst_capsfilter_transform_cap: 过滤器:(空)
    0:00:00.436965935 1252 0x13c780调试 capsfilter gstcapsfilter.c:300:gst_capsfilter_transform_cap: 电容滤波器:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、帧速率=(fraction) 25/1
    0:00:00.437009367 1252 0x13c780调试 capsfilter gstcapsfilter.c:301:gst_capsfilter_transform_cap: 相交:video/x-raw、format=(string) NV12、width=(int) 176、height=(int) 144、framerate=(fraction) 25/1
    无法链接元素。

    那么、您知道我的代码中可能遇到了什么问题吗?感谢您的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能评论这一行:
    G_object_set (G_object (video_parse)、"framerate"、25、1、NULL);
    我在您正在运行的流水线中看不到它。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您也可以检查此 e2e 线程:
    e2e.ti.com/.../518974

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    哦,抱歉,我已经设置了“视频粗”元素的属性。但是你没有注意到这一点。所以,你能给我一些其他的建议吗。我将访问你给我的网站,找到一些有用的信息。总之,谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我知道为视频粗略元素设置了帧速率属性。 我只是看不到在您在控制台中执行的管道中设置此属性。 您提供的调试日志来自 capsfilter。 请提供完整的调试日志。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我还建议您检查视频粗线的属性。
    gstreamer.freedesktop.org/.../gst-plugins-bad-plugins-videoparse.html
    您是否可以尝试删除"176"和"144"中的""、高度和宽度是 gint 类型。
    我还建议您重新检查 Capsfilter 设置。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我尝试了您的建议、但它不起作用。然后我尝试了以下代码、这些代码可以捕获并编码到 avi 文件中。

    开始时,我使用 comand 行来测试管道。它可以实现函数:capture 并编码到 avi 文件中。

    gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4! 'video/x-raw、format=(string) YUY2、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'! VPE num-input-buffers=8! 排队! ducatih264enc bitrate = 4000! 排队! h264parse! 真棒! 文件链接位置= x.avi 

    但是、当我编写我自己的应用程序时遇到相同的问题。我运行了代码、如下所示:

    #include 
    
    /********* 可行测试管道********
    gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4! 'video/x-raw、
    format=(string) YUY2、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'! VPE num-input-buffers=8!
    排队! ducatimpeg4enc bitrate = 4000! 排队! 太棒了! 真棒! 文件链接位置=x.mp4
    
    root@am57xx - EVM:~# gst-launch-1.0 -e v4l2src device=/dev/video1 num-basers=1000 io-mode=4!'video/x-raw、
    format=(string) yuY2、width=(int) 1280、height=(int) 720、framerates=(frame=(frame=)30/1'! VPE num-input-buffers=8!
    队列!ducatih264enc bitrate = 4000!queue!h264parse!qtmux!文件链接位置= x.avi
    
    mount - t nfs - o nolock、nfsvers = 3 - o proto = TCP 10.8.198.148:/ home / nfs / gggcc gggcc gst-
    
    test.c - o ggst - test `` pkg-config --cfrlams
    ***-glip-glams - grglams - gggvers-gggvers /
    
    int main (int argc、char * argv[])
    {
    GstElement *管道、* src、*过滤器、* myvpe、* q1、 *需要过滤器、* Q2、*解析、*多路复用、*灌电流;//k Ω
    GstCaps * caps1;
    GstBus *bus;
    GstMessage *msg;
    GstStateChangeReturn;
    GST_init (&argc、&argv);
    
    流水线= GST_F管线_NEW ("视频编码器");
    
    src = GST_ELECK_FACTORY_make ("v4l2src"、"src");
    filter = GST_ELECK_FACTORY_make ("capsfilter"、"filter");
    myvpe = GST_Element _factory_make ("VPE"、"myvpe");
    Q1 = GST_Element_factory_make ("队列"、"Q1");
    enc = GST_Element_factory_make ("ducatih264enc"、 "ENC");
    Q2 = GST_ELECK_factory_make ("队列"、"Q2");
    parse = GST_ELECK_factory_make ("h264parse"、"parso");
    mux = gst_element_factory_make ("qtmux"、"mux");
    sink = gst_el元_factory_make ("filesink"、"sink");
    
    if (!pipeline ||!src ||!filter || myvpe ||!enc ||!printer|| Q2 | sink parse ||!mux"、"!stract_!s|
    
    
    
    
    
    !g"、"!susb&tract!s|!r"、"!sb&tract_set!s|!g.g.tract.g"(/dev/video1)、无法创建一个!!!!!!!!!!!!!!!!!!! null);
    g_object_set (G_object (src)、"num-buffers"、1000、NULL);
    G_object_set (G_object (src)、"IO-mode"、4、NULL);
    
    caps1 = GST_CAP_NEW _SIMPLE ("VIDEO/x-RAW"、
    "format"、G_TYPE_string、"YUy2"、
    "width"、G_TYPE_INT、 1280、
    "高度"、G_TYPE_INT、720、
    "帧速率"、 GST_TYPE_FRATLE、30、1、
    NULL);
    
    g_object_set (G_object (filter)、 "caps"、caps1、NULL);
    GST_object_UNREF (caps1);
    
    g_object_set (G_object (myvpe)、 "num-input-buffers"、8、NULL);
    
    g_object_set (G_object (enc)、"bitrate "、 4000、NULL);
    
    g_object_set (G_object (sink)、"location"、"/home/root/81.avi、 null);
    
    gst_bin_add_many (gst_bin (流水线)、src、filter、myvpe、 Q1、编码、Q2、解析、多路复用、 灌电流、空);
    IF (GST_ELECK_LINK_M许多(src、filter、myvpe、 Q1、编码、Q2、解析、多路复用、 sink)!= true)
    {
    g_printerr ("元素无法链接。\n");
    gst_object_unresef (流水线);
    return -1;
    }
    ret = gst_element_set_state (流水线、gst_state_playing);
    if (ret = gst_state_change_failure){
    gst_printerr ("无法设置 Gst_element;gst_gst_message_gst
    
    
    
    
    = gst_gst_gst
    ;gstop_time_message_gst = gst);gstage_gstop_time_message_gst (gst = gst = gstipeline);gst = gstage_time_message_gstage_gstage_gst (gst);gst = gstage_time_out_time_message_time_
    
    
    
    GST_OBJECT_UNREF (BUS);
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);
    GST_OBJECT_UNREF (流水线);
    返回0;
    } 

    它显示了相同的问题:

    (捕获:1264):glib-GObject-Critical **:G_object_UNREF:断言"G_is_object (object)"失败
    无法链接元素。

    这让我感到困惑,你能给我提供任何其他解决问题的方法。非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请在您的一侧尝试此代码。 它构建的管道是使用 videotestsrc 构建的。

    #include
    #include


    /*总线错误功能*/

    静态 gboolean bus_call (GstBus *总线、GstMessage * msg、gpointer 数据)

    GMainLoop * loop =(GMainLoop *)数据;
    开关(GST_MESSAGE_TYPE (消息))

    案例 GST_MESSAGE_EOS:
    g_print ("流结束\n");
    G_MAIN_LOOP_QUIT (LOOP);
    中断;

    案例 GST_MESSAGE_ERROR:

    gchar *调试;
    GError *错误;
    GST_MESSAGE_PART_ERROR (msg、&error、&DEBUG);
    G_FREE (调试);
    G_printerr ("错误:%s\n"、错误->消息);
    G_ERROR_FREE (错误);
    G_MAIN_LOOP_QUIT (LOOP);
    中断;


    默认值:
    中断;


    返回 true;



    静态 gboolean link_source_element_wo_filter (GstElement *元件1、
    GstElement *元件2)


    要链接的/* CAPS:
    *'video/x-raw、format=(string) YUY2、width=(int) 800、height=(int) 600、framerate=5/1'
    ***/

    gboolean link_ok;
    GstCaps *caps;

    CAP = GST_caps_new_Simple ("video/x-rain"、
    "format"、G_TYPE_string、"NV12"、
    "宽度"、G_TYPE_INT、800、
    "高度"、G_TYPE_INT、600、
    "帧速率"、GST_TYPE_FRATE、5、1、
    null);

    LINK_OK = GST_ELEGER_LINK_FILTERED (元件1、元件2、电容);
    GST_caps_UNREF (cap);

    如果(!link_ok){
    G_warning ("链接元件1和元件2失败!(v4l2src->convert)");

    返回 LINK_OK;




    /*主函数执行双处理*/

    int main (int argc、char * argv[])

    //gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'! VPE num-input-buffers=8! 排队! ducatih264enc bitrate = 4000! 排队! h264parse! 真棒! 文件链接位置= x.mov

    GstElement *管道、* src、*转换、* q1、*编码、 *Q2、*parse、*mux、*SINK;
    GstBus *总线;
    GstMessage *msg;


    GST_init (&argc、&argv);

    /*创建空管道*/
    流水线= GST_F管线_NEW ("测试管线");

    /*创建元素*/
    src = gst_element_factory_make ("videotestsrc"、"video_source");
    G_object_set (G_object (src)、"num-buffers"、50、NULL);
    转换= GST_ELEGIT_factory_make ("VPE"、"converped");
    G_object_set (G_object (src)、"num-input-buffers"、8、NULL);
    Q1 = GST_ELECK_factory_make ("队列"、"Q1");
    ENC = GST_ELECIN_FACTOR_make ("ducatih264enC"、"enC");
    Q2 = GST_ELEGIN_FACTOR_make ("队列"、"Q2");
    parse = gst_elie_factory_make ("h264parse"、"parser");
    多路复用器= GST_ELECK_FACTORY_make ("qtmux"、"mux");
    SINK = GST_ELECK_factory_make ("文件链接"、"接收器");
    G_object_set (G_object (sink)、"location"、"/home/root/x.mov、NULL);


    /*链接所有可以自动链接的元素,因为它们具有“始终”的 PADS */


    gst_bin_add_many (gst_bin (流水线)、src、convert、q1、编码、 Q2、parse、mux、sink、NULL);

    link_source_element_with 滤波器(src、convert);
    gst_element_link_many (convert、q1、enc、q2、parse、 多路复用器、灌电流、空);




    /*开始播放流水线*/
    GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);

    /*等待错误或 EOS */
    总线= GST_ELECK_GET_BUS (管线);
    MSG = GST_BUST_TIME_POP_FILTERED (BUS、GST_CLOCK_TIME_NOE、GST_MESSAGE_ERROR | GST_MESSAGE_EOS);



    /*免费资源*/
    if (msg != NULL )

    GST_MESSAGE_UNREF (消息);

    GST_OBJECT_UNREF (总线);
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);

    GST_OBJECT_UNREF (管道);
    返回0;


    请告诉我结果。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我尝试了您的代码。在 AM5728中没有任何输出(现象)的情况下、它没有任何错误。但是、由于您的代码、我有了一个新的想法来更改我的代码。我会尽快尝试它。非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    它只是显示消息:[770.342944] OMAP-iommu 55082000.MMU:55082000.MMU:2.1版。
    但我不知道其含义。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    视频文件将位于目录/home/root/x.mov 中、请在此处检查输出文件。


    这里还有在我的 PC 上工作的示例代码。
    #include
    #include


    /*总线错误功能*/

    静态 gboolean bus_call (GstBus *总线、GstMessage * msg、gpointer 数据)

    GMainLoop * loop =(GMainLoop *)数据;
    开关(GST_MESSAGE_TYPE (消息))

    案例 GST_MESSAGE_EOS:
    g_print ("流结束\n");
    G_MAIN_LOOP_QUIT (LOOP);
    中断;

    案例 GST_MESSAGE_ERROR:

    gchar *调试;
    GError *错误;
    GST_MESSAGE_PART_ERROR (msg、&error、&DEBUG);
    G_FREE (调试);
    G_printerr ("错误:%s\n"、错误->消息);
    G_ERROR_FREE (错误);
    G_MAIN_LOOP_QUIT (LOOP);
    中断;


    默认值:
    中断;


    返回 true;



    静态 gboolean link_source_element_wo_filter (GstElement *元件1、
    GstElement *元件2)


    要链接的/* CAPS:
    *'video/x-raw、format=(string) YUY2、width=(int) 800、height=(int) 600、framerate=5/1'
    ***/

    gboolean link_ok;
    GstCaps *caps;

    CAP = GST_caps_new_Simple ("video/x-rain"、
    "format"、G_TYPE_string、"NV12"、
    "宽度"、G_TYPE_INT、800、
    "高度"、G_TYPE_INT、600、
    "帧速率"、GST_TYPE_FRATE、5、1、
    null);

    LINK_OK = GST_ELEGER_LINK_FILTERED (元件1、元件2、电容);
    GST_caps_UNREF (cap);

    如果(!link_ok){
    G_warning ("链接元件1和元件2失败!(v4l2src->convert)");

    返回 LINK_OK;




    /*主函数执行双处理*/

    int main (int argc、char * argv[])

    //gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'!videoconvert! 排队! x264编码! 排队! h264parse! 真棒! 文件链接位置= x.mov

    GstElement *管道、* src、*转换、* q1、*编码、 *Q2、*parse、*mux、*SINK;
    GstBus *总线;
    GstMessage *msg;


    GST_init (&argc、&argv);

    /*创建空管道*/
    流水线= GST_F管线_NEW ("测试管线");

    /*创建元素*/
    src = gst_element_factory_make ("videotestsrc"、"video_source");
    G_object_set (G_object (src)、"num-buffers"、50、NULL);
    转换= GST_ELECK_FACTORY_make ("video"、"converped");
    //g_object_set (G_object (src)、"num-input-buffers"、8、NULL);
    Q1 = GST_ELECK_factory_make ("队列"、"Q1");
    ENC = GST_ELECIN_FACTOR_make ("x264enC"、"enC");
    Q2 = GST_ELEGIN_FACTOR_make ("队列"、"Q2");
    parse = gst_elie_factory_make ("h264parse"、"parser");
    多路复用器= GST_ELECK_FACTORY_make ("qtmux"、"mux");
    SINK = GST_ELECK_factory_make ("文件链接"、"接收器");
    G_object_set (G_object (sink)、"location"、"/home/mms/Desktop/gsttests/x.mov、NULL);


    /*链接所有可以自动链接的元素,因为它们具有“始终”的 PADS */


    gst_bin_add_many (gst_bin (流水线)、src、convert、q1、编码、 Q2、parse、mux、sink、NULL);

    link_source_element_with 滤波器(src、convert);
    gst_element_link_many (convert、q1、enc、q2、parse、 多路复用器、灌电流、空);




    /*开始播放流水线*/
    GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);

    /*等待错误或 EOS */
    总线= GST_ELECK_GET_BUS (管线);
    MSG = GST_BUST_TIME_POP_FILTERED (BUS、GST_CLOCK_TIME_NOE、GST_MESSAGE_ERROR | GST_MESSAGE_EOS);



    /*免费资源*/
    if (msg != NULL )

    GST_MESSAGE_UNREF (消息);

    GST_OBJECT_UNREF (总线);
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);

    GST_OBJECT_UNREF (管道);
    返回0;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我尝试了您的代码。它可以成功地进行编码和解码。因此我了解了您构建流水线的方法、如下所示:

    #include

    /********* 可行测试管道********
    gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4! '视频/x-raw、
    format=(string) YUY2、width=(int) 1280、height=(int) 720、帧速率=(fraction) 30/1'! VPE num-input-buffers=8!
    排队! ducatimpeg4enc bitrate = 4000! 排队! 太棒了! 真棒! 文件链接位置= x.mp4

    root@am57xx - EVM:~# gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4!'video/x-raw、
    format=(string) YUY2、width=(int) 1280、height=(int) 720、帧速率=(fraction) 30/1'! VPE num-input-buffers=8!
    队列!ducatih264enc 位速率=4000 !队列!h264parse !qtmux !filesink 位置= x.avi

    mount - t nfs - o nolock、nfsvers = 3 - o proto = TCP 10.8.198.148:/ home / nfs / mnt

    gcc gst - test.c - o gst - test `pkg-config - cfligs --libs gstreamer - 1.0`
    (三 /


    静态 gboolean link_source_eleme_wo_filter (GstElement *元件1、
    GstElement *元件2)


    要链接的/* CAPS:
    *'video/x-raw、format=(string) YUY2、width=(int) 800、height=(int) 600、framerate=5/1'
    ***/

    gboolean link_ok;
    GstCaps *caps;

    cap = gst_caps_new_Simple ("video/x-rain"、
    "format"、G_TYPE_string、"YUy2"、
    "宽度"、G_TYPE_INT、1280、
    "高度"、G_TYPE_INT、720、
    "帧速率"、GST_TYPE_FRATE、30、1、
    null);

    LINK_OK = GST_ELEMENT _LINK_FILTERED (元件1、元件2、电容);
    GST_caps_UNREF (cap);

    如果(!link_ok){
    g_warning ("链接元件1和元件2失败!(v4l2src->convert)");

    返回 LINK_OK;



    int main (int argc、char * argv[])

    GstElement *管道,* src,* myvpe,* q1,*编码, *Q2、*解析、*多路复用器、*灌电流;//需要过滤器
    GstCaps *caps1;
    GstBus *总线;
    GstMessage *msg;
    GstStateChangeReturn;
    GST_init (&argc、&argv);

    流水线= GST_F管线_NEW ("视频编码器");

    src = gst_element_factory_make ("v4l2src"、"src");

    //filter = gst_element_factory_make ("capsfilter"、"filter");

    myvpe = gst_elue_factory_make ("vp"、"myvpe");
    Q1 = GST_ELECK_factory_make ("队列"、"Q1");
    ENC = GST_ELECIN_FACTOR_make ("ducatih264enC"、"enC");
    Q2 = GST_ELECK_factory_make ("队列"、"Q2");
    parse = gst_elie_factory_make ("h264parse"、"parse");
    多路复用器= GST_ELECIN_FACTOR_make ("qtmux"、"mux");
    SINK = GST_ELECIN_FACTOR_make ("filesink"、"SINK);

    if (!pipeline ||!src ||!myvpe ||!q1||!enc||!q2||!parse ||!mux ||!sink)

    g_printerr ("无法创建一个元素。正在退出。\n");
    返回-1;


    G_object_set (G_object (src)、"device"、"/dev/video1、NULL);
    G_object_set (G_object (src)、"num-buffers"、1000、NULL);
    G_object_set (G_object (src)、"IO-mode"、4、NULL);

    G_object_set (G_object (myvpe)、"num-input-buffers"、8、NULL);

    G_object_set (G_object (enc)、"位速率"、4000、NULL);

    G_object_set (G_object (sink)、"位置"、"/home/root/81.avi、NULL);

    gst_bin_add_many (gst_bin (流水线)、src、myvpe、q1、编码、 Q2、parse、mux、sink、NULL);

    link_source_element_with _filter (src、myvpe);

    if (gst_element_link_many)(myvpe、q1、enc、q2、parse、 多路复用器、灌电流)!= true)

    g_printerr ("无法链接元素。\n");
    GST_OBJECT_UNREF (管道);
    返回-1;

    RET = GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);
    if (ret =GST_State_change_failure){
    g_printerr ("无法将管道设置为正在播放状态。\n");
    GST_OBJECT_UNREF (管道);
    返回-1;


    总线= GST_ELECK_GET_BUS (管线);
    MSG = GST_BUST_TIME_POP_FILTERED (BUS、GST_CLOCK _TIME_NOE、GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

    if (msg != NULL )
    GST_MESSAGE_UNREF (消息);
    GST_OBJECT_UNREF (BUS);
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);
    GST_OBJECT_UNREF (管道);
    返回0;


    Howwever、它显示消息:无法链接元素。
    我不理解的是我只更改了 src (videotestsrc ->v4l2src)、它不起作用?是我错过了流水线中的某个内容、还是执行了错误的设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1.您是否在控制台中测试过此管道?
    g st-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 IO-mode=4! '视频/x-raw、
    format=(string) YUY2、width=(int) 1280、height=(int) 720、帧速率=(fraction) 30/1'! VPE num-input-buffers=8!
    排队! ducatih264enc 比特率= 4000! 排队! h264parse! 真棒! 文件链接位置= x.avi

    2.我建议您添加 GST-调试、以便检查哪些元素未链接。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请您回复! 我已经测试了管道、它成功地工作了。
    我添加了 GST 调试、就像这样:--gst-debug=2、ducatih264enc*:6
    它显示:
    0:00:00.105707306 1388 0x143ce0日志 qtmux gstqtmux.c:4624:gst_qt_mux_register:注册多路复用器
    0:00:00.106825314 1388 0x143ce0日志 qtmux gstqtmux.c:4662:gst_qt_mux_register:已完成多路复用器注册
    0:00:00.106858173 1388 0x143ce0日志 qtmux gstqtmux.c:4668:gst_qt_mux_register:注册标签
    0:00:00.106889079 1388 0x143ce0日志 qtmux gstqtmux.c:4674:gst_qt_mux_register:已完成标记注册
    0:00:00.109600895 1388 0x143ce0调试 qtmux gstqtmux.c:4368:gst_qt_mux_request_new_pad: 请求的 PAD:VIDUO_0
    无法链接元素。
    0:00:00.110273197 1388 0x143ce0调试 qtmux gstqtmux.c:4308:gst_qt_mux_release_pad: 释放 mux:video_0
    0:00:00.110310122 1388 0x143ce0调试 qtmux gstqtmux.c:4312:gst_qt_mux_release_pad:检查 mux:video_0

    然后、我运行命令行:gst-inquo-1.0 qtmux
    我知道 qtmux 需要一个请求的焊盘、因为它的散热焊盘并不是一个始终如一的焊盘。

    让我感到困惑的是、您没有添加所需的焊盘、您的代码正常工作。所以我真的想具体说明原因。

    如果您不介意、可以给我 QQ 或其他任何方式方便地联系您。 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是否可以尝试将队列元素放在此处:

    (笑声) !! h264parse! 排队! qtmux…

    请告诉我结果。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!


    如果上述建议在您的案例中不起作用、您也可以手动请求 qtmux 焊盘。
    实际上、在 GST_qt_mux_request_new_pad 日志中: 请求的 PAD: VIDUO_0似乎已请求该 PAD.
    您还可以尝试通过 GST_Element _Link_PADS 函数手动链接所有元素的 PADS。

    请告诉我结果。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我必须在元素"qtmux"中添加请求的焊盘、
    #include

    静态 gboolean link_source_eleme_wo_filter (GstElement *元件1、
    GstElement *元件2)

    gboolean link_ok;
    GstCaps *caps;

    cap = gst_caps_new_Simple ("video/x-rain"、
    "format"、G_TYPE_string、"YUy2"、
    "宽度"、G_TYPE_INT、1280、
    "高度"、G_TYPE_INT、720、
    "帧速率"、GST_TYPE_FRATE、30、1、
    null);

    LINK_OK = GST_ELEMENT _LINK_FILTERED (元件1、元件2、电容);
    GST_caps_UNREF (cap);

    如果(!link_ok){
    g_warning ("链接元件1和元件2失败!(v4l2src->convert)");

    返回 LINK_OK;


    int main (int argc、char * argv[])

    GstElement *管道,* src,* myvpe,* q1,*编码, *Q2、*解析、*多路复用器、*灌电流;//需要过滤器
    GstCaps *caps1;
    GstBus *总线;

    GstPadTemplate * mux_sink_pad_template;
    GstPad * pad1、* pad2;
    gchar *name;


    GstMessage *msg;
    GstStateChangeReturn;
    GST_init (&argc、&argv);

    流水线= GST_F管线_NEW ("视频编码器");

    src = gst_element_factory_make ("v4l2src"、"src");

    //filter = gst_element_factory_make ("capsfilter"、"filter");

    myvpe = gst_elue_factory_make ("vp"、"myvpe");
    Q1 = GST_ELECK_factory_make ("队列"、"Q1");
    ENC = GST_ELECIN_FACTOR_make ("ducatih264enC"、"enC");
    Q2 = GST_ELECK_factory_make ("队列"、"Q2");
    parse = gst_elie_factory_make ("h264parse"、"parse");
    多路复用器= GST_ELECIN_FACTOR_make ("qtmux"、"mux");
    SINK = GST_ELECIN_FACTOR_make ("filesink"、"SINK);

    if (!pipeline ||!src ||!myvpe ||!q1||!enc||!q2||!parse ||!mux ||!sink)

    g_printerr ("无法创建一个元素。正在退出。\n");
    返回-1;


    G_object_set (G_object (src)、"device"、"/dev/video1、NULL);
    G_object_set (G_object (src)、"num-buffers"、1000、NULL);
    G_object_set (G_object (src)、"IO-mode"、4、NULL);

    G_object_set (G_object (myvpe)、"num-input-buffers"、8、NULL);

    G_object_set (G_object (enc)、"位速率"、4000、NULL);

    /******* 添加所需焊盘的一种方法 8
    /* mux_sink_pad_template = gst_element_class_get_pad_template (gst_element_get_class (mux)、"sink_%d");
    if (mux_sink_pad_template=NULL)
    g_printerr ("hsg\n");
    pad1 = gst_element_request_pad (mux、mux_sink_pad_template、NULL、NULL);
    pad2 = gst_el元_get_static_pad (parse、"src");

    if (pad2 ==空)
    g_printerr ("hsg1\n");

    GST_PAD_LINK (pad2、pad1);*/

    /******* 添加请求的 PAD 的另一种方法是********* /
    pad2 = gst_el元_get_static_pad (parse、"src");
    pad1 = gst_el元_get_compatible _pad (mux、pad2、NULL);
    GST_PAD_LINK (pad2、pad1);

    G_object_set (G_object (sink)、"位置"、"/home/root/81.avi、NULL);

    gst_bin_add_many (gst_bin (流水线)、src、myvpe、q1、编码、 Q2、parse、mux、sink、NULL);

    link_source_element_with _filter (src、myvpe);

    if (gst_element_link_many)(myvpe、q1、enc、q2、parse、 多路复用器、灌电流)!= true)

    g_printerr ("无法链接元素。\n");
    GST_OBJECT_UNREF (管道);
    返回-1;

    RET = GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);
    if (ret =GST_State_change_failure){
    g_printerr ("无法将管道设置为正在播放状态。\n");
    GST_OBJECT_UNREF (管道);
    返回-1;


    总线= GST_ELECK_GET_BUS (管线);
    MSG = GST_BUST_TIME_POP_FILTERED (BUS、GST_CLOCK _TIME_NOE、GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

    if (msg != NULL )
    GST_MESSAGE_UNREF (消息);
    GST_OBJECT_UNREF (BUS);

    GST_object_UNREF (GST_object (pad1));

    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);
    GST_OBJECT_UNREF (管道);
    返回0;


    代码的结果为:
    0:00:00.103270722 1457 0x143ee0日志 qtmux gstqtmux.c:4624:gst_qt_mux_register:注册多路复用器
    0:00:00.104316832 1457 0x143ee0日志 qtmux gstqtmux.c:4662:gst_qt_mux_register:已完成多路复用器注册
    0:00:00.104350504 1457 0x143ee0日志 qtmux gstqtmux.c:4668:gst_qt_mux_register:注册标签
    0:00:00.104381085 1457 0x143ee0日志 qtmux gstqtmux.c:4674:gst_qt_mux_register:已完成标记注册
    0:00:00.105626298 1457 0x143ee0调试 qtmux gstqtmux.c:4368:gst_qt_mux_request_new_pad: 请求的 PAD:VIDUO_0
    无法链接元素。
    0:00:00.107839866 1457 0x143ee0调试 qtmux gstqtmux.c:4308:gst_qt_mux_release_pad: 释放 mux:video_0
    0:00:00.107876954 1457 0x143ee0调试 qtmux gstqtmux.c:4312:gst_qt_mux_release_pad:检查 mux:video_0

    我不知道我添加所请求的焊盘的方式是否错误?
    那么、您能否告诉我我我代码中是否存在问题(我尝试了两种方法来制作上面要求的焊盘。)
    非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1.您是否可以将视频_%d 更改为视频_%u 并尝试?
    使用 GST-CHECG-1.0 qtmux、您可以检查 mux 在接收器上的功能。

    2.如果上述操作不起作用,请您对 qtmux 元素进行注释并将 h264parse 连接到文件链接,以验证问题是否来自 qtmux。

    请告诉我。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请查看有关电极垫的本教程:
    gstreamer.freedesktop.org/.../pads.html

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    很抱歉、现在我在您的代码中看到了所需焊盘的两个版本。
    我将在我的一侧尝试、完成后我将在这里发布代码。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您可以尝试以下 GST 代码。
    如您所见、多路复用器是手动链接的(LINK_TO_multiplexer 函数)。 我还手动连接了 GST 元件的焊盘。
    在 parse 和 mux 元素之间添加一个队列。
    请根据您的用例更改电容滤波器分辨率、帧速率和格式。

    #include
    #include


    /*总线错误功能*/

    静态 gboolean bus_call (GstBus *总线、GstMessage * msg、gpointer 数据)

    GMainLoop * loop =(GMainLoop *)数据;
    开关(GST_MESSAGE_TYPE (消息))

    案例 GST_MESSAGE_EOS:
    g_print ("流结束\n");
    G_MAIN_LOOP_QUIT (LOOP);
    中断;

    案例 GST_MESSAGE_ERROR:

    gchar *调试;
    GError *错误;
    GST_MESSAGE_PART_ERROR (msg、&error、&DEBUG);
    G_FREE (调试);
    G_printerr ("错误:%s\n"、错误->消息);
    G_ERROR_FREE (错误);
    G_MAIN_LOOP_QUIT (LOOP);
    中断;


    默认值:
    中断;


    返回 true;



    静态 gboolean link_source_element_wo_filter (GstElement *元件1、
    GstElement *元件2)


    要链接的/* CAPS:
    *'video/x-raw、format=(string) YUY2、width=(int) 800、height=(int) 600、framerate=5/1'
    ***/

    gboolean link_ok;
    GstCaps *caps;

    CAP = GST_caps_new_Simple ("video/x-rain"、
    "format"、G_TYPE_string、"NV12"、
    "宽度"、G_TYPE_INT、800、
    "高度"、G_TYPE_INT、600、
    "帧速率"、GST_TYPE_FRATE、5、1、
    null);

    LINK_OK = GST_ELEGER_LINK_FILTERED (元件1、元件2、电容);
    GST_caps_UNREF (cap);

    如果(!link_ok){
    G_warning ("链接元件1和元件2失败!(v4l2src->convert)");

    返回 LINK_OK;




    void link_to 多路复用器(
    GstElement * tolink_element、
    GstElement *多路复用器)

    GstCap * pad_caps =空;
    GstPad *垫;
    GstPad * tolink_pad;
    GstPadLinkReturn;

    tolink_pad = gst_element_get_static_pad (tolink_element、"src");
    PAD_CAP = GST_PAD_QUIEST_CAP (tolink_PAD、NULL);
    PAD = GST_ELECING_GET_compatible _pad (mux、tolink_pad、pad_cap);
    GST_caps_UNREF (PAD_CAP);

    RET = GST_PAD_LINK (tolink_PAD、PAD);
    GST_OBJECT_UNREF (GST_OBJECT (PAD));
    g_print ("创建了新的焊盘%s 并链接到%s\n"、GST_PAD_GET_NAME (tolink_PAD)、GST_PAD_GET_NAME (焊盘));



    /*主函数执行双处理*/

    int main (int argc、char * argv[])

    //gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'! VPE num-input-buffers=8! 排队! ducatih264enc bitrate = 4000! 排队! h264parse! 真棒! 文件链接位置= x.mov

    GstElement *管道、* src、*转换、* q1、*编码、 *Q2、*parse、*Q3、*mux、*SINK;
    GstBus *总线;
    GstMessage *msg;


    GST_init (&argc、&argv);

    /*创建空管道*/
    流水线= GST_F管线_NEW ("测试管线");

    /*创建元素*/
    src = gst_element_factory_make ("v4l2src"、"video_source");
    G_object_set (G_object (src)、"device"、"/dev/video1、NULL);
    G_object_set (G_object (src)、"IO-mode"、4、NULL);
    G_object_set (G_object (src)、"num-buffers"、50、NULL);
    转换= GST_ELEGIT_factory_make ("VPE"、"converped");
    G_object_set (G_object (src)、"num-input-buffers"、8、NULL);
    Q1 = GST_ELECK_factory_make ("队列"、"Q1");
    ENC = GST_ELECIN_FACTOR_make ("ducatih264enC"、"enC");
    Q2 = GST_ELEGIN_FACTOR_make ("队列"、"Q2");
    parse = gst_elie_factory_make ("h264parse"、"parser");
    Q3 = GST_ELECK_factory_make ("队列"、"Q3");
    多路复用器= GST_ELECK_FACTORY_make ("qtmux"、"mux");
    SINK = GST_ELECK_factory_make ("文件链接"、"接收器");
    G_object_set (G_object (sink)、"location"、"/home/root/x.mov、NULL);


    gst_bin_add_many (gst_bin (流水线)、src、convert、q1、编码、 Q2、解析、Q3、多路复用器、灌电流、 null);



    link_source_element_with 滤波器(src、convert);
    //gst_element_link_pads (src、"src"、convert、"sink");
    GST_ELECK_LINK_PADS (CONVERT、"src"、Q1、"接收器");
    GST_ELECK_LINK_PADS (Q1、"src"、编码、"接收器");
    GST_ELECK_LINK_PADS (编码、"src"、解析、"接收器");
    GST_ELECK_LINK_PADS (解析、"src"、Q3、"接收器");
    Link_TO_multiplexer (Q3、mux);
    GST_ELECK_LINK_PADS (多路复用器、"src"、灌电流、"灌电流");

    /*开始播放流水线*/
    GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);

    /*等待错误或 EOS */
    总线= GST_ELECK_GET_BUS (管线);
    MSG = GST_BUST_TIME_POP_FILTERED (BUS、GST_CLOCK_TIME_NOE、GST_MESSAGE_ERROR | GST_MESSAGE_EOS);



    /*免费资源*/
    if (msg != NULL )

    GST_MESSAGE_UNREF (消息);

    GST_OBJECT_UNREF (总线);
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);

    GST_OBJECT_UNREF (管道);
    返回0;



    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的代码! 我尝试了您的代码,但它出现了问题:

    创建了一个新的 PAD src 并链接到 VIDEO 0
    0:00:00.148453016 1536 0x148a90警告 basesrc gstbasesrc.c:2948:gst_base_src_loop: 错误:内部数据流错误。
    0:00:00.148537928 1536 0x148a90警告 basesrc gstbasesrc.c:2948:gst_base_src_loop: 错误:流任务暂停、原因未协商(-4)

    我为文件 x.mov 提供资金、它是0位。

    我一直被问题困扰:内部数据流错误。因为我既找不到有关 此问题结果的任何信息,也找不到解决此问题的任何方法。

    所以、如果您知道解决问题的方法、您能帮我吗?如果您有一些有关问题的信息、您能与我分享吗?非常感谢!

    我搜索 了元素"qtmux"的焊盘模板:

    焊盘模板:

    接收模板:'VIDE__%u'
    供货情况:按需提供
    具有 request_new_pad ()函数:gst_qt_mux_request_new_pad
    功能:
    视频/x-raw
    格式:{ RGB、UYVY、V210 }
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/MPEG
    mpegversion:4.
    系统流:false
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-DivX
    DIVxversion:5.
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-ProRes
    变体:{standard、lt、HQ、proxy}
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-h263
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-h264
    流格式:AVC
    对齐:Au
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-svq
    svqversion:3.
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-dv
    系统流:false
    宽度:[16、2147483647]
    高度:[16、2147483647]
    图像/jpeg
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-VP8
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-DIrac
    宽度:[16、2147483647]
    高度:[16、2147483647]
    视频/x-qt-part
    宽度:[16、2147483647]
    高度:[16、2147483647]

    显示的消息:创建了一个新的 PAD src 并链接到 VIDEO _0。这是否意味着 qtmux 的接收垫的功能是:

    视频/x-raw
    格式:{ RGB、UYVY、V210 }
    宽度:[16、2147483647]
    高度:[16,2147483647]  ?

    ‘ll、我的流水线是 h264流。这只是我的猜测。我尝试设置 qtmux 的接收垫的功能。  

    非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    正如我前面所说的、您必须根据 您的用例在 link_source_element_with _filte 函数中更改分辨率、帧速率和格式。

    错误: 错误:流任务暂停、原因未协商(-4)大多数情况都意味着 cap 过滤器 lika 格式、帧速率等有问题


    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    很抱歉、我在理解您的回复时出错了。我已经尝试过。它可以捕获并编码到文件中。视频可以解码。
    非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我想问您一些问题。我想逐一捕捉和编码视频。我的意思是,在捕捉第一个视频并对其进行编码后,它将跟随下一个视频,第三个视频......

    视频是不同的。那么、在流水线 发布后、我可以做些什么?可以给我一些建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    很抱歉、我有几个问题可以理解您的问题:

    1.当第一个视频完成时,是否要销毁管道并为第二个视频重新启动管道?
    或者、您希望管道处于播放状态、并且只希望将"第二个视频"保存在不同的文件中(名称不同)?
    3.第一、第二等视频的捕捉源是否相同?
    4.您所说的视频有什么不同,是按名称、容器还是其他类型?

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    很抱歉、我没有清楚地表达我的问题。我希望管道处于播放状态、并希望用差分名称保存"第二个视频"(我能否同时更改视频的分辨率和帧速率) 我使用同一个摄像机来捕获视频。
    如果无法实现,我是否可以销毁管道,设置元素的属性,然后在接下来的视频中再次启动它?
    可以给我一些建议吗?非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当流水线处于正在播放状态时、可以取消链接/链接 gstreamer 元素、这是可能的。
    但请记住、如果您在 两个视频之间取消链接/链接元素(最后一个)帧将丢失、这是由取消链接/链接导致的。
    如果您想更改捕获源的分辨率、我认为在这种情况下不起作用、您应该销毁管道。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、您还可以查看此教程:
    gstreamer.freedesktop.org/.../pipeline-manipulation.html

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我使用此命令从以下网站捕获 MP4文件并将其编码为:。  processors.wiki.ti.com/.../Processor_Training:_Multimedia

    gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4! '视频/x-raw、
    format=(string) YUY2、width=(int) 1280、height=(int) 720、帧速率=(fraction) 30/1'! VPE num-input-buffers=8!
    排队! ducatimpeg4enc bitrate = 4000! 排队! 太棒了! 真棒! 文件链接位置= y.mp4

    但 MP4文件的属性显示  其帧速率为23。 文件的比特率为 4058 kbps。

    但是、当我使用此命令时:

    gst-launch-1.0 videotestsrc num-buffers=500! 'video/x-raw、format=(string) YUY2、width=(int) 1280、height=(int) 720、framerate=(fraction) 30/1'! VPE num-input-buffers=8! 排队! ducatimpeg4enc bitrate = 4000! 排队! 太棒了! 真棒! 文件链接位置= x.mp4

    它运行良好、  没有任何帧速率和 比特率问题:

    那么、您能告诉我问题的原因、并给我一些建议来解决这个问题。

    谢谢(&C)!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您确定您的视频源能够在30fps 时提供1280x720吗?
    您可以尝试在相同的 fps 下使用较低的分辨率吗?

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我确信我的摄像头能够在30fps 时提供1280x720。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您可以尝试以下操作:
    v4l2src device=/dev/video1 num-buffers=1000 IO-mode=2...
    请告诉我结果。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我尝试过,但它不起作用。它显示:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您使用的是 PSDK 版本?

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我使用了4.0 SDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我怀疑这不是编码器问题。
    但是、在 GST h264中存在一个内存泄漏问题、该问题已经得到修复、请参阅此主题中所述的此主题和 CP GST 库并进行尝试。
    e2e.ti.com/.../620539

    我建议您查看此 wiki 页面(调试章节):
    processors.wiki.ti.com/.../Linux_Core_VIP_User's_Guide

    由于使用 videotestsrc 的管道正常工作、请检查 v4l2src 是否正在丢弃帧。

    希望这对您有所帮助。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请检查此答案:
    e2e.ti.com/.../2328878

    希望这对您有所帮助。

    BR
    玛格丽塔