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.

[参考译文] 编译器:AM5728:GStream 播放 TS 文件

Guru**** 2553610 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/596483/compiler-am5728-gstream-playing-ts-files

工具/软件:TI C/C++编译器

您好:

我将在本地保存 test.ts 文件并使用以下 gstream 命令正确显示它。

gst-launch-1.0 -v 文件 rc location=test.ts! 排队! tsdemux! h264parse! ducatih264dec! 陆上接收机  

我尝试使用 C 语言进行写入,编译执行时不显示映像。

这是我的源代码:

#include
#include
#include
#include
#include
#include
#include
#include
int main (int argc、char * argv[])
  GstElement *pipeline、*文件 rc、*队列、* tsdemux、* h264parse、 *ducatih264dec,*waylandsink;
  静态 GMainLoop *循环;
  GST_init (&argc、&argv);
  循环= g_main_loop_new (NULL、false);
  流水线= GST_F管线_NEW ("流水线");
  if (!流水线){
    g_printerr ("%d gst_pipel_new error \n"、__line__);
    返回-1;
  }
  文件 rc = gst_element_factory_make ("filesrc"、"filesrc0");
  if (!filesrc){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  队列= GST_ELECK_factory_make ("队列"、"队列0");
  如果(!queue){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  tsdemux = gst_elem_factory_make ("tsdemux"、"tsdemux0");
  如果(!tsdemux){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  h264parse = gst_elue_factory_make ("h264parse0"、"h264parse0");
  if (!h264parse){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  ducatih264dec = gst_elue_factory_make ("ducatih264dec "、"ducatih264dec0");
  如果(!ducatih264dec){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  waylandsink = gst_elue_factory_make ("waylandsink"、"waylandsink0");
  if (!waylandsink){
    g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
  }
  G_object_set (G_object (filesrc)、"location"、"test.ts"、NULL);
  gst_bin_add_many (gst_bin (流水线)、文件 rc、队列、tsdemux、h264parse、 ducatih264dec、waylandsink、NULL);
  gst_elem_link_many (文件 rc、队列、tsdemux、h264parse、ducatih264dec、 陆上接收机,空);
  GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);
  G_MAIN_LOOP_RUN (LOOP);
  G_MAIN_LOOP_UNREF (LOOP);
  返回0;

执行时、我尝试添加"-GST-DEBUG = 4"参数、红色部分显示错误消息

GST_ELECK_PADS ../../gstreamer-1.2.3/gst/gstelement.c:894:GST_ELECK_GET_STATIC_PAD:元素"filesrc0"中没有此类 PADS "链接"
0:00:02.207006671 1091  0x13d8f0信息         GST_EVENT ./../gstreamer-1.2.3/gst/gstevent.c:709:GST_EVENT_NEW _SEGMENT:创建段事件字节段 start=0、stop=1、rate =1.000000、appled_rate =1.000000、flags=0x00、 time=0、base=0、位置0、持续时间1875968
0:00:02.207197967 1091  0x13d8f0信息          basesrc ./../../../gstreamer-1.2.3/libs/gst/base/gstbasesrc.c:2772:gst_base_src_loop: 标记待处理(续
0:00:02.207344855 1091  0x13d8c0信息     mpegtspacketizer ./../../git/gst/mpegtsdemux/mpegtspacketizer.c:770:mpegts_try_discover_packet_size:检测到打包大小:188字节
0:00:02.207464578 1091  0x13d8c0信息        mpegtsbase ./../../git/gst/mpegtsdemux/mpegtsbase.c:726:mpegts_base_apply_pat: 患者
0:00:02.207720941 1091  0x13d8c0信息     GST_ELECK_PADS ../../gstreamer-1.2.3/gst/gstelement.c:897:GST_ELECK_GET_STATIC_PAD:找到焊盘 tsdemux0:sink
0:00:02.207803413 1091  0x13d8c0信息         gst_event ../../gstreamer-1.2.3/gst/gstevent.c:628:gst_event_new_cap:创建 cap 事件 video/x-h264、stream-format=(string) byte-stream、alignment=(string) nal
0:00:02.208967130 1091  0x13d8c0信息     GST_ELECK_PADS ../../gstreamer-1.2.3/gst/gstelement.c:646:GST_ELECK_ADD_PAD: 添加焊盘'VIDUO_0041'
0:00:02.209020485 1091  0x13d8c0信息         GST_EVENT ./../gstreamer-1.2.3/gst/gstevent.c:709:GST_EVENT_NEW:创建段事件时间段 start=0:00:00.125000000、stop=99:99:99.99999999999、rate = 1.000000、appled_rate = 1.000000、flags=0x00、 时间= 0:00:00.125000000、基数= 0:00:00.000000000、位置0:00:00.125000000、持续时间为99:99:99.999999999
0:00:02.209187869 1091  0x13d8c0信息           task ./../gstreamer-1.2.3/gst/gsttask.c:300:gst_task_func: 任务将暂停
0:00:02.209288559 1091  0x13d8f0信息          basesrc ./../../../gstreamer-1.2.3/libs/gst/base/gstbasesrc.c:2785:gst_base_src_loop: GST_PAD_PUSH ()=未链接后暂停
0:00:02.209340125 1091  0x13d8f0警告          basesrc ./../../../gstreamer-1.2.3/libs/gst/base/gstbasesrc.c:2865:gst_base_src_loop: 错误:内部数据流错误。
0:00:02.2093797 1091  0x13d8f0警告          basesrc ./../../../gstreamer-1.2.3/libs/gst/base/gstbasesrc.c:2865:gst_base_src_loop: 错误:流任务暂停、原因未链接(-1)
0:00:02.209429266 1091  0x13d8f0信息     GST_ERROR_SYSTEM ./../gstreamer-1.2.3/gst/gstelement.c:1835:GST_ELECK_MESSAGE_FULL: 过帐消息:内部数据流错误。
0:00:02.209511250 1091  0x13d8f0信息     GST_ERROR_SYSTEM ./../gstreamer-1.2.3/gst/gstelement.c:1858:GST_ELECK_MESSAGE_FULL: 已发布错误消息:内部数据流错误。
0:00:02.562908161 1091  0x13d8f0信息           task ./../gstreamer-1.2.3/gst/gsttask.c:300:gst_task_func: 任务将暂停
请帮助我解决问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好:
    非常感谢。
    请尽快帮我解决。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在代码中、我看不到正确添加多路信号分离器元件。

    使用 GST-CHECG-1.0 、您可以检查 SRC 和接收器模板。

    以下是可添加多路信号分离器的示例:

    静态空 on_pad_added (GstElement *元素、GstPad *填充、gpointer 数据)

    GstPad *正弦板;

    gchar *name;

    GstElement * vqueue =(GstElement *)数据;

    GstElement *排队=(GstElement *)数据;

    /*将此焊盘与队列散热焊盘连接*/

    名称= GST_PAD_GET_NAME (PAD);

    if (strncmp (name、"video_00"、NULL)==0){

    g_print ("已创建动态填充、链接多路信号分离器/灌电流\n");

    SINKPAD = GST_ELECK_GET_STATUS_PAD (vqueue、"灌电流");

    GST_PAD_LINK (PAD、SINKPAD);

    GST_OBJECT_UNREF (SINKPAD);

      }  

    否则、如果(strncmp (name、"audio_00"、 NULL)==0){

    g_print ("动态填充已创建、链接多路信号分离器/异路复用器\n");

    SINKPAD = GST_ELECK_GET_STATUS_PAD (Aqueue、"灌电流");

    GST_PAD_LINK (PAD、SINKPAD);

    GST_OBJECT_UNREF (SINKPAD);

    printf ("%s"-新焊盘'%s'、\n"、__function__、name);

    粗体测试应根据您使用的多路信号分离器(GS-Inspect 命令中的 SRC 和接收器模板)进行更改。

    使用函数 g_signal_connect 、您可以"监听"新创建的多路信号分离器的焊盘并链接元件。

    BR
    玛格丽塔

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

    您好!

    请尝试以下代码:



    #include
    #include




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

    GMainLoop * loop =(GMainLoop *)数据;

    switch (GST_MESSAGE_TYPE (msg)){
    案例 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;




    静态空 on_pad_added (GstElement *元素、GstPad *填充、gpointer 数据)

    GstPad *正弦板;
    gchar *name;

    GstElement * vqueue =(GstElement *)数据;
    GstElement *排队=(GstElement *)数据;
    /*将此焊盘与队列散热焊盘连接*/
    名称= GST_PAD_GET_NAME (PAD);
    if (strncmp (name、"video_0041"、NULL)==0){
    g_print ("已创建动态填充、链接多路信号分离器/灌电流\n");
    SINKPAD = GST_ELECK_GET_STATUS_PAD (vqueue、"灌电流");
    GST_PAD_LINK (PAD、SINKPAD);
    GST_OBJECT_UNREF (SINKPAD);


    printf ("%s"-新焊盘'%s'、\n"、__function__、name);





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

    GMainLoop *LOOP;
    GstBus *总线;
    GstCaps *caps;

    GstElement *管道;
    GstElement *文件 rc;
    GstElement *多路解复用器;
    GstElement *虚拟队列;
    GstElement *解析器;
    GstElement *解码器;
    GstElement *vsink;





    /*初始化*/
    GST_init (&argc、&argv);
    LOOP = g_main_loop_new (NULL、false);

    /*创建 gstreamer 元素*/

    流水线= GST_F管线_NEW ("tsplay");

    filesrc = gst_element_factory_make ("filesrc"、"filesource");
    G_RETURE_VAL_IF_FAIL (文件 rc、-1);
    G_object_set (G_object (filesrc)、"location"、argv[1]、NULL);

    多路信号分离器= GST_ELECIN_FACTOR_make ("tsdemux"、"Demux");
    G_RETURE_VAL_IF_FAIL (多路信号分离器、-1);

    vqueue = gst_element_factory_make ("队列"、"vqueue");
    G_RETURE_VAL_IF_FAIL (vqueue、-1);

    解析器= gst_elie_factory_make ("h264pars"、"解析器");
    G_RETURE_VAL_IF_FAIL (解析器、-1);

    解码器= GST_ELECK_factory_make ("ducatih264dec、"解码器");
    G_RETURE_VL_IF_FAIL (解码器、-1);


    vsink = gst_elue_factory_make ("waylandsink"、"sink");
    G_RETURE_VAL_IF_FAIL (vsink、-1);



    /*添加消息处理程序*/
    总线= GST_F管线_GET_BUS (GST_管线(管线));
    GST_BUS_ADD_WATCH (BUS、BUS_CALL、LOOP);
    GST_OBJECT_UNREF (总线);


    /*在链接元素之前将元素添加到管道中。*/


    gst_bin_add (gst_bin (流水线)、文件 rc);
    GST_BIM_ADD (GST_BIN (流水线)、多路信号分离器);
    GST_BIM_ADD (GST_BIN (流水线)、vqueue);
    GST_BIN_ADD (GST_BIN (流水线)、解析器);
    GST_BIM_ADD (GST_BIN (流水线)、解码器);
    GST_BIM_ADD (GST_BIN (流水线)、VSINK);


    /*链接管道*/
    gst_elem_link_pads (文件 rc、"src"、多路解复用器、"接收器");
    GST_ELECK_LINK_PADS (多路信号分离器、"src"、vqueue、"接收端");
    /*收听新创建的焊盘*/
    G_signal_connect (G_object (多路信号分离器)、"pad-added"、G_callback (ON_pad_added)、vqueue);
    gst_element_link_pads (vqueue、"src"、解析器、"sink");
    GST_ELECK_LINK_PADS (解析器、"src"、解码器、"接收器");
    GST_ELECTER_LINK_PADS (解码器、"src"、VSINK、"接收器");

    /*将流水线设置为"播放"状态*/
    g_print ("正在播放:%s\n"、argv[1]);
    GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);

    /*迭代*/
    g_print ("正在运行...\n");
    G_MAIN_LOOP_RUN (LOOP);

    /*在主循环之外,清理得很好*/
    g_print ("已返回、正在停止回放\n");
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);

    G_PRINT ("删除管道\n");
    GST_OBJECT_UNREF (GST_object (流水线));

    返回0;


    请告诉我结果。
    执行:./


    BR
    玛格丽塔

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

    如果此代码对您有效、请验证答案。

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

    很抱歉、我在源代码中看到我忘记了 UNREF (msg)。 请添加此行
    GST_MESSAGE_UNREF ( msg );以前
    返回 true;

    调用函数中的函数。

    BR
    玛格丽塔