Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C程序中使用Gstreamer动态添加和删除视频中的字幕_C_Video_Gstreamer_Subtitle - Fatal编程技术网

如何在C程序中使用Gstreamer动态添加和删除视频中的字幕

如何在C程序中使用Gstreamer动态添加和删除视频中的字幕,c,video,gstreamer,subtitle,C,Video,Gstreamer,Subtitle,对于一个学校项目,我必须用gstreamer和gtk做一个视频阅读器,不带playbin2。 在这个阅读器中,我必须在视频阅读时添加和删除字幕 目前我使用decodebin播放所有格式,但无法添加字幕。 我成功地使用oggdemux制作了动态字幕,但这种解决方案仅适用于ogg格式。因此,我使用decodebin搜索其他解决方案 我尝试了许多解决方案: 解码箱和字幕 首先,我尝试将字幕gstreamer元素直接添加到视频队列中。我确认我的程序没有字幕gstreamer元素(正在播放音频/视频) 字

对于一个学校项目,我必须用gstreamer和gtk做一个视频阅读器,不带playbin2。 在这个阅读器中,我必须在视频阅读时添加和删除字幕

目前我使用
decodebin
播放所有格式,但无法添加字幕。 我成功地使用oggdemux制作了动态字幕,但这种解决方案仅适用于ogg格式。因此,我使用decodebin搜索其他解决方案

我尝试了许多解决方案:

解码箱和字幕 首先,我尝试将字幕gstreamer元素直接添加到视频队列中。我确认我的程序没有字幕gstreamer元素(正在播放音频/视频)

字幕的新管道 其次,我尝试创建另一个只包含字幕gstreamer元素的管道

// Creation of many elements of gstreamer
data.pipeline = gst_pipeline_new ("video-player");  
date.subtitle = gst_pipeline_new ("subtitles");
source_media = gst_element_factory_make ("filesrc",     "file-source");    
demuxer  = gst_element_factory_make ("decodebin",   "decodebin");
// AUDIO -----
sink_audio = gst_element_factory_make ("autoaudiosink", "audio-output");
queue_audio = gst_element_factory_make("queue", "thread-audio");

// VIDEO -----
sink_video  = gst_element_factory_make ("autovideosink", "video-output");    
queue_video = gst_element_factory_make("queue", "thread-video");

// SUBTITLE -----    
source_sub = gst_element_factory_make("filesrc", "sub-source");
subparse = gst_element_factory_make("subparse", "subparse");
textoverlay = gst_element_factory_make ("subtitleoverlay", "subtitleoverlay");

g_object_set (G_OBJECT (source_media), "location", argv[1], NULL);
g_object_set (G_OBJECT (source_sub), "location", argv[2], NULL);

gst_bin_add_many (GST_BIN (data.pipeline),
                     source_media, demuxer,
                     queue_audio, sink_audio,  
                     queue_video, sink_video, NULL);

gst_bin_add_many(GST_BIN (data.subtitle),
                 source_sub, subparse, textoverlay,
                 NULL);

gst_element_link (source_media, demuxer);  
gst_element_link (source_sub, subparse);

gst_element_link_many (queue_audio, sink_audio, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), queue_audio);
gst_element_link_many (queue_video, textoverlay, sink_video, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), queue_video);    
gst_element_link_many (source_sub, subparse, textoverlay, NULL);

if (gst_element_link_pads(subparse, "src", textoverlay, "subtitle-sink")) {
    perror("***error: Pads couldn't be linked\n");
}
您只需添加:

g_object_set (G_OBJECT (source_sub), "location", argv[2], NULL);
在您的第一个解决方案中,它应该起作用(除非您不提供字幕,在这种情况下,您应该检查字幕是否存在,并链接/取消链接元素)

然后,要在播放过程中激活/禁用字幕,您必须使用subtitleoverlay中的“无声”属性进行播放


祝你好运

嗨!谢谢你的回答,因为我发布了这个问题,我解决了我的问题;事实上,我使用了silent属性,它工作正常。再次感谢,祝你度过愉快的一天:-)过去的你好。好话题。通过阅读你的问题,我找到了解决办法。非常感谢。但我能问点事吗?您正在注册回调函数以检测视频文件中的PAD。可以在管道启动前完成吗?例如,生成filesrc和demuxer。然后将它们链接起来。然后运行“初始化”。所以,demuxer现在知道他会有多少垫子。我想避免的是分裂的代码,当一个管道和平在一个函数中完成(从文件读取),另一个在另一个函数中完成(解码和播放),但都在第三位链接在一起。
g_object_set (G_OBJECT (source_sub), "location", argv[2], NULL);