我想播放一个使用Gstreamer的C程序的视频,并从SRT文件中添加字幕。
我是gstreamer的新手,我不知怎么搞清楚了谁能让它在命令行中发挥作用:
gst-launch filesrc location=video.srt ! subparse ! \
overlay. filesrc location=video.ogv ! oggdemux name=demux \
demux. ! queue ! vorbisdec ! audioconvert ! autoaudiosink \
demux. ! queue ! theoradec ! ffmpegcolorspace ! subtitleoverlay name=overlay ! autovideosink;问题是,我可以播放一个C程序的视频,但我不知道如何添加字幕。
int main (int argc, char *argv[]) {
GMainLoop *loop;
GstElement *pipeline, *source, *demuxer, *audioDecoder, *videoDecoder, *audioConv, *videoConv, *videosink,
*audiosink, *audioQueue, *videoQueue;
GstBus *bus;
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
if (argc < 2 && argc > 3) {
g_printerr ("Usage: %s <Ogg/Vorbis filename> [Srt filename]\n", argv[0]);
return -1;
}
pipeline = gst_pipeline_new ("audiovideo-player");
source = gst_element_factory_make ("filesrc", "file-source");
demuxer = gst_element_factory_make ("oggdemux", "ogg-demuxer");
audioQueue = gst_element_factory_make ("queue", "audio-queue");
videoQueue = gst_element_factory_make ("queue", "video-queue");
audioDecoder = gst_element_factory_make ("vorbisdec", "vorbis-decoder");
videoDecoder = gst_element_factory_make ("theoradec", "theora-decoder");
audioConv = gst_element_factory_make ("audioconvert", "audio-converter");
videoConv = gst_element_factory_make ("ffmpegcolorspace", "video-converter");
videosink = gst_element_factory_make ("autovideosink", "video-output");
audiosink = gst_element_factory_make ("autoaudiosink", "audio-output");
if (!pipeline || !source || !demuxer || !audioDecoder || !audioConv || !videoDecoder || !videoConv || !audioQueue
|| !videoQueue || !audiosink || !videosink) {
g_printerr ("One element could not be created. Exiting.\n");
exit(-1);
}
g_object_set (G_OBJECT (source), "location", argv[1], NULL);
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
gst_bin_add_many (GST_BIN (pipeline),
source, demuxer,
audioQueue, videoQueue, audioDecoder, videoDecoder,
videoConv, audioConv, videosink, audiosink, NULL);
gst_element_link (source, demuxer);
gst_element_link_many (videoQueue, videoDecoder, videoConv, videosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), videoQueue);
gst_element_link_many (audioQueue, audioDecoder, audioConv, audiosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), audioQueue);
g_print ("Lecture de : %s\n", argv[1]);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_print ("En cours...\n");
g_main_loop_run (loop);
g_print ("Arret de la lecture\n");
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("Suppression du pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
return 0;
} 发布于 2014-10-20 13:56:19
在pad添加的回调(您只需要连接一次!)你必须检查新增加的垫盖。
无论如何,文件中的视频还需要连接到子标题覆盖,您将链接视频接收器后,子标题覆盖。您还可以将字幕文件的附加文件to链接到子标题覆盖。
查看一下用于字幕处理的playbin /play接收器中的代码,特别是动态处理这些内容的代码。还要注意,playbin有一个sub属性,它允许您选择一个应该覆盖在视频上的外部字幕文件。
发布于 2014-10-25 19:21:06
非常感谢塞巴斯蒂安博士,我终于可以播放这段带字幕的视频了。这是我做的代码。
gst_element_link_many (videoQueue, videoDecoder, videoConv, subOverlay, videosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), videoQueue);
gst_element_link_many (audioQueue, audioDecoder, audioConv, audiosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), audioQueue);
g_object_set (G_OBJECT (subSource), "location", argv[2], NULL);现在我正在考虑使用GTK来添加一些功能,比如暂停视频,它可能需要清理一点,但现在还可以。
https://stackoverflow.com/questions/26465983
复制相似问题