您好:
与 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;
}
如何设置音频和视频同步播放? 哪里出了问题?