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:MP4 AV 解决方案

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/641782/am5728-mp4-av-solution

主题中讨论的其他器件:AM5728

您好:

与 AM5728电路板上的解决方案 gstreamer 配合使用的 MP4音频和视频文件。

管道如下:

gst-launch-1.0 -v 文件 rc location=test.mp4! qtdemux  name=Demux demux.audio_0! 排队! 太棒了! 很棒! alsasink 设备=HW:0、0多路信号分离器.VIDEO_0! 排队!  太棒了! ducatimpeg4dec! 陆上接收机

我想将这些命令转换为源代码、并发现您无法播放音频和视频。 这是我的源器件。

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

GstPad *正弦板;
gchar *name;

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

否则、if (strncmp (name、"audio_0"、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);


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

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

GstElement *管道;
GstElement *文件 rc、* qtdemux、* queue0、* aacparse、* fad、 *alsasink;
GstElement *酷线1、*酷线4视频粗线、*酷线4解码、*航迹接收机;


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

/*创建 gstreamer 元素*/

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

filesrc = gst_element_factory_make ("filesrc"、"filesource");
G_RETURE_VAL_IF_FAIL (文件 rc、-1);
G_object_set (G_object (filesrc)、"location"、"test.mp4"、NULL);

qtdemux = gst_elem_factory_make ("qtdemux"、"qtdemux0");
G_RETURE_VAL_IF_FAIL (qtdemux、-1);

queue0 = gst_elue_factory_make ("队列"、"队列0");
G_RETURE_VAL_IF_FAIL (queue0、-1);

aacparse = gst_elue_factory_make ("aacparso"、"aacparser0");
G_RETURE_VAL_IF_FAIL (aacparse、-1);

fad = gst_element_factory_make ("faad"、"faad0");
G_RETURE_VAL_IF_FAIL (faad、-1);

alsasink = gst_elue_factory_make ("alsasink"、"alsasink0");
G_RETURE_VAL_IF_FAIL (alsasink、-1);

队列1 = GST_ELECK_factory_make ("队列"、"队列1");
G_RETURE_VAL_IF_FAIL (queue1、-1);

mpeg4videoparse= gst_elue_factory_make ("mpeg4videoparse0"、"mpeg4videoparse0");
G_RETURE_VAL_IF_FAIL (mpeg4视频粗略、-1);

ducatimpeg4dec = gst_elue_factory_make ("ducatimpeg4dec、"ducatimpeg4dec0");
G_RETURE_VAL_IF_FAIL (ducatimpeg4dec、-1);

waylandsink = gst_elue_factory_make ("waylandsink"、"waylandsink0");
G_RETURE_VAL_IF_FAIL (landsink、-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 (流水线)、qtdemux);
GST_BIN_ADD (GST_BIN (流水线)、queue0);
GST_bin/add (GST_bin (流水线)、aacparse);
GST_BIN_ADD (GST_BIN (流水线)、FAD);
GST_BIN_ADD (GST_BIN (流水线)、ALSASink);
GST_BIN_ADD (GST_BIN (流水线)、queue1);
GST_BIN_ADD (GST_BIN (流水线)、mpeg4视频粗调);
GST_BIM_ADD (GST_BIN (流水线)、ducatimpeg4dec);
GST_BIN_ADD (GST_BIN (流水线)、运水槽);

/*链接管道*/
gst_elem_link_pads (文件 rc、"src"、qtdemux、"接收器");
gst_elem_link_pads (qtdemux、"src"、queue0、"灌电流");
/*收听新创建的焊盘*/
G_signal_connect (G_object (qtdemux)、"pad-added"、G_callback (ON_pad_added)、queue0);
gst_element_link_pads (queue0、"src"、aacparse、"sink");
gst_element_link_pads (aacparse、"src"、faad、"sink");
GST_ELECK_LINK_PADS (faad、"src"、alsasink、"接收器");
GST_ELECTER_LINK_PADS (alsasink、"src"、queue1、"灌电流");
G_signal_connect (G_object (alsasink)、"pad-added"、G_callback (ON_pad_added)、queue1);
GST_ELECTER_LINK_PADS (queue1、"src"、mpeg4视频粗略、"灌电流");
gst_element_link_pads (mpeg4视频粗略、"src"、ducatimpeg4dec、"接收器");
GST_ELECTER_LINK_PADS (ducatimpeg4dec、"src"、waylandsink、"sink");

/*将流水线设置为"播放"状态*/
g_print ("正在播放:%s\n"、"test.mp4");
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
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我在中看不到要使用 g_object_set 函数设置的 device=HW:0、0属性。


    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好:
    我在代码中添加了"device"属性。 仍然没有视频和音频
    G_object_set (G_object (alsasink)、"设备"、"HW:0、0"、NULL);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:
    执行时、我尝试添加"-GST-DEBUG = 2"参数、红色部分显示错误消息
    root@am57xx-EVM:~./mp4_TO_display -gst-debug=2.
    播放:test.mp4
    [1137.918150] OMAP-IMU 55082000.MMU:55082000.MMU:2.1版
    0:00:00.162300991 1148 0x17b460 warn basesrc gstbasesrc.c:3489:g
    ST_BASE_src_START_COMPLETE: 焊盘尚未激活
    0:00:00.163063410 1148 0x176a30警告 qtdemux qtdemux.c:2651:qtde
    MUX_PARTM_TREX: 找不到流1的片段默认值
    0:00:00.163411029 1148 0x176a30警告 qtdemux qtdemux.c:2651:qtde
    MUX_PARTM_TREX: 找不到流2的片段默认值
    0:00:00.163672597 1148 0x176a30 warn basesrc gstbasesrc.c:2396:g
    ST_BASE_SRC_UPDATE_LENGTH: 或超过 EOS 时的处理
    动态焊盘已创建、连接多路信号分离器/灌电流
    0:00:00.164458114 1148 0x176a30警告 alsa conf.c:4729:pars_a
    RGS:alsalib 错误:参数 dev 必须为整数
    0:00:00.164523506 1148 0x176a30 warn alsa conf.c:4834:snd_con
    fig_expand:alsalib error:parse arguments error:invalid argument
    0:00:00.164565637 1148 0x176a30报警 ALSA PCM.c:2450:SND_PCM_
    open_noupdate:alsalib 错误:未知 PCM 硬件:0、0:{AES0 0x02 AES1 0x82 AES2 0x00 AES
    3 0x02}
    ON_PAD_ADDED_ADDED"新 PAD_VIDEO
    动态焊盘已创建、连接多路信号分离器/灌电流
    ON_PAD_ADDED_ADDED"新 PAD_"音频_0"
    0:00:00.172315239 1148 0x1769b0警告 alsa PCM_HW.c:1250:snd_p
    cm_hw_get_chmap:alsalib 错误:无法读取通道映射 ctl
    :没有这样的文件或目录


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

    您好!

    请尝试以下代码:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #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_%u"、NULL)==0){

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

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

    GST_PAD_LINK (PAD、SINKPAD);

    GST_OBJECT_UNREF (SINKPAD);

    否则 if (strncmp (name、"Audio _%u"、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);

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

    GMainLoop *LOOP;

    GstBus *总线;

    GstMessage *msg;

    GstCaps *caps;

    GstElement *管道;

    GstElement *文件 rc、* qtdemux、* Aqueue、* aacparse、* faad、 *alsasink;

    GstElement * vqueue、* mpeg4视频粗糙、* ducatimpeg4dec、*航拍沉;

    /*初始化*/

    GST_init (&argc、&argv);

    LOOP = g_main_loop_new (NULL、false);

    /*创建 gstreamer 元素*/

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

    filesrc = gst_element_factory_make ("filesrc"、"filesource");

    G_RETURE_VAL_IF_FAIL (文件 rc、-1);

    G_object_set (G_object (filesrc)、"location"、"test.mp4"、NULL);

    qtdemux = gst_elem_factory_make ("qtdemux"、"qtdemux0");

    G_RETURE_VAL_IF_FAIL (qtdemux、-1);

    Aqueue = GST_ELEMENT _ factory_make ("队列"、"队列0");  

    G_RETURE_VAL_IF_FAIL (Aqueue、-1);

    aacparse = gst_elue_factory_make ("aacparso"、"aacparser0");

    G_RETURE_VAL_IF_FAIL (aacparse、-1);

    FAD = GST_ELECIN_FACTOR_make ("avdec _AAC"、"AAC");

    G_RETURE_VAL_IF_FAIL (faad、-1);

    alsasink = gst_elue_factory_make ("alsasink"、"alsasink0");

    //g_object_set (G_object (alsasink)、"device"、"HW:0、0"、NULL);

    //alsasink = gst_elue_factory_make ("fakesink"、"alsasink0");

    G_RETURE_VAL_IF_FAIL (alsasink、-1);

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

    G_RETURE_VAL_IF_FAIL (vqueue、-1);

    mpeg4videoparse= gst_elue_factory_make ("mpeg4videoparse0"、"mpeg4videoparse0");

    G_RETURE_VAL_IF_FAIL (mpeg4视频粗略、-1);

    ducatimpeg4dec = gst_elue_factory_make ("ducatimpeg4dec、"ducatimpeg4dec0");

    G_RETURE_VAL_IF_FAIL (ducatimpeg4dec、-1);

    waylandsink = gst_elue_factory_make ("waylandsink"、"waylandsink0");

    G_RETURE_VAL_IF_FAIL (landsink、-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 (流水线)、qtdemux);

    GST_BIM_ADD (GST_BIN (流水线)、Aqueue);

    GST_bin/add (GST_bin (流水线)、aacparse);

    GST_BIN_ADD (GST_BIN (流水线)、FAD);

    GST_BIN_ADD (GST_BIN (流水线)、ALSASink);

    GST_BIM_ADD (GST_BIN (流水线)、vqueue);

    GST_BIN_ADD (GST_BIN (流水线)、mpeg4视频粗调);

    GST_BIM_ADD (GST_BIN (流水线)、ducatimpeg4dec);

    GST_BIN_ADD (GST_BIN (流水线)、运水槽);

    /*链接管道*/

    gst_elem_link_pads (文件 rc、"src"、qtdemux、"接收器");

    GST_ELECK_LINK_PADS (qtdemux、"src"、Aqueue、"灌电流");

    /*收听新创建的焊盘*/

    G_signal_connect (G_object (qtdemux)、"pad-added"、G_callback (ON_pad_added)、Aqueue);

    GST_ELECK_LINK_PADS (Aqueue、"src"、aacparse、"SINK_);

    gst_element_link_pads (aacparse、"src"、faad、"sink");

    GST_ELECK_LINK_PADS (faad、"src"、alsasink、"接收器");

    GST_ELECK_LINK_PADS (alsasink、"src"、vqueue、"sink");

    G_signal_connect (G_object (qtdemux)、"pad-added"、G_callback (ON_pad_added)、vqueue);

    gst_element_link_pads (vqueue、"src"、mpeg4videoparse、"灌电流");

    gst_element_link_pads (mpeg4视频粗略、"src"、ducatimpeg4dec、"接收器");

    GST_ELECTER_LINK_PADS (ducatimpeg4dec、"src"、waylandsink、"sink");

    /*将流水线设置为"播放"状态*/

    g_print ("正在播放:%s\n"、"test.mp4");

    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;

    //gcc DemuX_av.c -o DemuX_av `pkg-config -CFLAGS --libs gstreamer-1.0`

    错误出现在此行 g_signal_connect (G_object (alsasink)、"pad-added"、G_callback (ON_pad_added)、vqueue)中;

    它应该是 g_signal_connect (G_object (qtdemux)、"pad-added"、G_callback (ON_pad_added)、vqueue);

    BR
    玛格丽塔

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

    您好;

    非常感谢您,使用 filesrc 可以播放 mp4文件

    现在、我将使用 appsrc 替换 filesrc、代码如下所示

    静态空 CB_need_data (GstElement *应用 src、
    guint unused_size、
    gpointer USER_DATA)

    静态 GstClockTime 时间戳= 0;
    GstBuffer *缓冲区;
    内部大小;
    GstFlowReturn;

    大小= 1024*1024;

    Buffer = GST_Buffer_new_Allocate (NULL、大小、空);

    fp = fopen ("../test.mp4"、"rb");

    if (fp ==0)

    printf ("openfile erro\n");
    G_MAIN_LOOP_QUIT (LOOP);

    GstMapInfo 地图;
    if (GST_buffer_map (buffer、&map、GST_MAP_write))

    静态 int totsize = 0;
    int ret = fread (map.data、1、map.size、fp);

    如果(RET <= 0)

    printf ("读取 erro、ret:%d、totsize:%d byte\n"、ret、totsize);
    fclose (FP);
    fp = 0;
    总大小= 0;
    //goto loop_playback;//loop Play
    G_MAIN_LOOP_QUIT (LOOP);

    totsize+= ret;
    GST_buffer_unmap (buffer、&map);

    GST_buffer_PTS (buffer)=时间戳;
    GST_buffer_duration (buffer)= GST_util_uint64_scale_int (1、GST_second、2);
    时间戳+= GST_buffer_duration (buffer);
    G_signal_emit_by 名称(appsrc、"push-buffer"、buffer、&ret);
    GST_buffer_UNREF (缓冲区);

    if (ret!= GST_flow_OK){
    printf ("#exit ret:%d\n"、ret);
    /*出错,停止推送*/
    G_MAIN_LOOP_QUIT (LOOP);

    将 g_object_set (g_object (filesrc)、"location"、"test.mp4"、NULL)更改为 g_signal_connect (filesrc、"need-data"、G_callback (CB_need_data)、NULL)

    编译以下错误的实现。

    root@am57xx-EVM:~#./mp4
    播放:test.mp4
    [5750.011927] OMAP-IMU 55082000.MMU:55082000.MMU:2.1版
    正在运行...
    错误:内部数据流错误。
    已返回,正在停止播放

    (MP4_TO_DISPLAY:1299):GStreamer-critical **:GST_MINI_OBJECT_UNREF:断言'min
    I_OBJECT->refcount >0'失败
    正在删除管道

    我在 qtdemux 之前添加了队列。  但结果仍然相同

    appsrc-->队列--> qtdemux->.........

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

    我将检查源代码、并在我有东西时返回给您。
    同时、我建议您查看本教程:
    gstreamer.freedesktop.org/.../short-cutting-the-pipeline.html
    请记住、此行 GST_buffer_UNREF (sample)出错;必须为 GST_SAMPLE_UNREF (sample);

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

    在您的代码中,我看不到:
    G_signal_connect (data.app_source、"足够数据"、G_callback (stop_sfeed)、&data);
    之后:
    G_signal_connect (data.app_source、"需要数据"、G_callback (start_sfeed)、&data);

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好:
    我写了一条热线来播放本地文件 test.h264,如下所示:
    appsrc -> queue -> h264parse -> ducatih264dec -> waylandsink
    编译和执行、可以正确播放

    #include
    #include
    #include

    静态 GMainLoop *循环;
    静态文件*fp=0;

    静态 gboolean bus_callback (GstBus *总线、GstMessage *消息、gpointer * ptr)

    switch (GST_MESSAGE_TYPE (message)){

    案例 GST_MESSAGE_ERROR:{
    gchar *调试;
    GError *err;
    GST_MESSAGE_PART_ERROR (message、&err、&debug);
    g_print ("错误%s\n"、错误->消息);
    G_ERROR_FREE (错误);
    G_FREE (调试);

    中断;

    案例 GST_MESSAGE_WARNING:{
    gchar *调试;
    GError *err;
    const gchar *名称;
    GST_MESSAGE_PART_WARNING (消息、错误、调试);
    g_print ("警告%s\n 调试%s\n"、ERR->消息、调试);

    名称= GST_MESSAGE_SRC_NAME (message);

    g_print (" src %s\n"的名称、名称? 姓名:"无");
    G_ERROR_FREE (错误);
    G_FREE (调试);

    中断;

    案例 GST_MESSAGE_QoS:
    G_MAIN_LOOP_QUIT (LOOP);
    中断;

    案例 GST_MESSAGE_STATE_CHANGEed:
    中断;

    默认值:
    g_print ("收到消息%s\n"、\
    GST_MESSAGE_TYPED_NAME (GST_MESSAGE_TYPE (MESSAGE));
    中断;


    返回 true;


    静态空 CB_need_data (GstElement *应用 src、
    很好 未使用的_size、
    gpointer USER_DATA)

    静态 GstClockTime 时间戳= 0;
    GstBuffer *缓冲区;
    内部大小;
    GstFlowReturn;

    大小= 1024*1024;

    Buffer = GST_Buffer_new_Allocate (NULL、大小、空);

    fp = fopen ("../test.h264"、"rb");

    if (fp ==0)

    printf ("openfile erro\n");
    G_MAIN_LOOP_QUIT (LOOP);


    GstMapInfo 地图;
    if (GST_buffer_map (buffer、&map、GST_MAP_write))

    静态 int totsize = 0;
    int ret = fread (map.data、1、map.size、fp);

    如果(RET <= 0)

    printf ("读取 erro、ret:%d、totsize:%d byte\n"、ret、totsize);
    fclose (FP);
    fp = 0;
    总大小= 0;
    //goto loop_playback;//loop Play
    G_MAIN_LOOP_QUIT (LOOP);

    totsize+= ret;
    GST_buffer_unmap (buffer、&map);


    GST_buffer_PTS (buffer)=时间戳;
    GST_buffer_duration (buffer)= GST_util_uint64_scale_int (1、GST_second、2);
    时间戳+= GST_buffer_duration (buffer);
    G_signal_emit_by 名称(appsrc、"push-buffer"、buffer、&ret);
    GST_buffer_UNREF (缓冲区);

    if (ret!= GST_flow_OK){
    printf ("#exit ret:%d\n"、ret);
    /*出错,停止推送*/
    G_MAIN_LOOP_QUIT (LOOP);



    gint main (gint argc、gchar * argv[])

    GstElement *pipeline、*appsrc、*队列、*h264parse、*ducatih264dec、 *陆上沉水器;
    //

    /* init GStreamer */
    GST_init (&argc、&argv);

    LOOP = g_main_loop_new (NULL、false);

    /*设置管道*/
    流水线= GST_F管线_NEW ("流水线");

    appsrc = gst_element_factory_make ("appsrc"、"source-file");

    队列= GST_ELECK_factory_make ("队列"、"队列0");

    h264parse = gst_elie_factory_make ("h264parse0"、"h264parse0");

    ducatih264dec = gst_elie_factory_make ("ducatih264dec "、"ducatih264dec0");

    waylandsink = gst_elie_factory_make ("waylandsink"、"waylandsink0");

    GstBus *总线;
    总线= GST_PIPRAIN_GET_BUS ((GstPipeline*)管线);
    GST_BUS_ADD_WATCH (BUS、(GstBusFunc) BUS_CALLBACK、0);

    /*设置*/
    G_signal_connect (appsrc、"需要数据"、G_callback (CB_need_data)、NULL);
    gst_bin_add_many (gst_bin (pipeline)、appsrc、queue、h264parse、ducatih264dec、 陆上接收机,空);
    gst_elue_link_many (appsrc、queue、h264parse、ducatih264dec、landsink、 null);


    /*播放*/
    GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);
    G_MAIN_LOOP_RUN (LOOP);

    /*清理*/
    GST_ELECK_SET_STATE (流水线、GST_STATE_NULL);
    GST_OBJECT_UNREF (GST_object (流水线));
    G_MAIN_LOOP_UNREF (LOOP);

    返回0;



    我不明白为什么无法播放 mp4文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!


    请检查此链接以了解基本数据包和容器包之间的区别:
    容器:
    en.wikipedia.org/.../Container_format_(digital)
    en.wikipedia.org/.../QuickTime_File_Format

    基本数据包:
    en.wikipedia.org/.../Video_compression_format
    en.wikipedia.org/.../H264

    我建议您检查 cap 的教程链接及其设置方式。

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

    您好:

    您是否已验证此问题?

    我阅读了您提供的链接、但我仍然不知道如何解决我遇到的问题

    我怀疑 appsrc 与 qtdemux 不兼容

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

    您好!

    两个元素 appsrc 和 qtdemux 都不是 TI 元素。
    请记住、test.mp4视频在容器中。 因此、如果您尝试将基本流推送到 qtdemux 中、将无法正常工作。正如我所说、请尝试设置您的 appsrc 元素的上限。
    用于处理视频的用例是基本流。

    请查看此链接:
    gstreamer-devel.narkive.com/.../problem-with-appsink-buffer-in-gstreamer-1-0


    BR
    玛格丽塔