如何在视频上添加 SRT 文件的字幕并在 c 程序中使用 Gstreamer 播放

     2023-03-07     219

关键词:

【中文标题】如何在视频上添加 SRT 文件的字幕并在 c 程序中使用 Gstreamer 播放【英文标题】:How to add subtitles from a SRT file on a video and play it with Gstreamer in a c program 【发布时间】:2014-10-20 12:42:00 【问题描述】:

我想通过 C 程序使用 Gstreamer 播放视频并从 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;
 

【问题讨论】:

【参考方案1】:

在 pad-added 回调中(您只需要连接一次!)您必须检查新添加的 pad 的 cap。

无论如何,文件中的视频也需要连接到 subtitleoverlay,并且您将在 subtitleoverlay 之后链接视频接收器。并且您也可以将字幕文件的附加 filesrc 链接到 subtitleoverlay。

查看 playbin/playsink 中用于字幕处理的代码,尤其是动态处理这些内容的代码。另请注意,playbin 有一个 sub-uri 属性,可让您选择应覆盖在视频上的外部字幕文件。

【讨论】:

我没有全部了解,但如果可能的话,我正在寻找没有 playbin 的解决方案。 您不清楚哪些部分? :) 另外你为什么不想使用 playbin,这是我们推荐用于任何播放用例的(除了超级特殊的,你的似乎不是)。 我不明白pad部分。关于 playbin,这是因为我被要求在没有它的情况下让它工作(否则我会很乐意使用它)。很抱歉我缺乏知识,但我最近才开始使用 gstreamer,我发现最接近的是没有解释的纯代码。 我改了命令行,这个更好吗?能否请您解释一下需要链接的内容以及链接方式或教程链接是什么意思? 是的,您拥有的新 gst-launch 管道是正确的。或者,您也可以将 subparse 替换为 typefind 元素,在这种情况下,subtitleoverlay 将根据格式本身为字幕渲染选择适当的元素。你也可以用 decodebin 替换解复用器和解码器(如果你使用 GStreamer 0.10,你可以使用 decodebin2,但实际上使用 1.x)。【参考方案2】:

非常感谢 Sebastian Drödge,我终于可以播放带字幕的视频了。这是我完成的代码。

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 添加暂停视频等功能,它可能需要稍微清理一下,但现在就可以了。

【讨论】:

合并视频文件和字幕

...r1.mp4chapter1.srtchapter2.mp4chapter2.srtchapter3.mp4chapter3.srt我知道如何合并视频文件,但是字幕呢,我不想将其硬编码为视频。是否可以合并并在单个.srt文件中设置适当的时间?【问题讨论】:使用ff 查看详情

使用ffmpeg删除导出视频字幕文件(代码片段)

...青空。前些天看到一个群里有人在问,有没有办法把视频中的字幕删除掉。我想了想,可以使用FFmpeg这个软件来处理。该方法适用于视频中的软字幕,就是平常我们做视频在剪映类似软件上自己加上去的字幕。下载FFm... 查看详情

人人译视界-给视频添加srt字幕

1、下载人人译视界软件   http://mydown.yesky.com/pcsoft/413544526.html 2、准备好视频和字幕文件  3、导入视频   4、选择字幕文件  5、配置参数压制视频   6、小功告成  查看详情

如何使用 TimedTextSource 在 MediaElement 上查看(srt)字幕

】如何使用TimedTextSource在MediaElement上查看(srt)字幕【英文标题】:HowtouseTimedTextSourcetoview(srt)subtitleonMediaElement【发布时间】:2018-09-2417:38:57【问题描述】:我知道可以使用MediaElement观看外部字幕,但我不知道如何。谁能解释一... 查看详情

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

】如何在C程序中使用Gstreamer在视频中动态添加和删除字幕【英文标题】:HowtoaddandremovedynamicallysubtitleinvideowithGstreamerinaCprogram【发布时间】:2014-10-2910:07:31【问题描述】:对于一个学校项目,我必须用gstreamer和gtk做一个视频阅读... 查看详情

如何在 Xcode 中打开 .srt 文件?

】如何在Xcode中打开.srt文件?【英文标题】:Howtoopen.srtfileinXcode?【发布时间】:2013-02-2103:37:27【问题描述】:我有一个APP可以播放视频和.srt字幕。问题是我不知道如何打开.srt字幕文件。我试过了:NSString*content=[NSStringstringWithCon... 查看详情

使用 ffmpeg 为视频添加 SRT 字幕

】使用ffmpeg为视频添加SRT字幕【英文标题】:AddSRTsubtitletovideowithffmpeg【发布时间】:2011-08-3007:58:52【问题描述】:我使用ffmpeg编码,并通过以下命令为视频添加字幕$ffmpeg-ihifi.avi-ihifi.srt-acodeclibfaac-ar48000-ab128k-ac2-vcodeclibx264-vpreipod... 查看详情

从 ios 应用程序播放空气时,外部 srt 字幕未显示在 Apple tv 中

...程序中使用UILabel显示字幕。但是当我向AppleTV播放相同的视频时,不会显示相同的字幕。当字幕来自外部srt文 查看详情

SRT 字幕的最大尺寸

...【问题描述】:对于一个项目,我将扩展字幕的概念以在视频中嵌入信息。我会使用SRT格式。注意:我的字幕不打算显示。它们仅对我的软件有用(且有意义)。SRT的syntax是众所周知的并且非常简单:用于识别每个连续字幕的数... 查看详情

如何在 MPMoviePlayerController 上处理多个 SRT 文件

】如何在MPMoviePlayerController上处理多个SRT文件【英文标题】:HowtohandlemultipleSRTfilesonMPMoviePlayerController【发布时间】:2015-10-0207:09:08【问题描述】:我想用MPMoviePlayerController做一些特别的事情;这样我就可以显示选项供用户选择自... 查看详情

json2srt:剪映字幕json转srt

...过macOS:剪映1.3.1测试通过此工具需要带一个参数,即json文件所处的目录名称。Windows上,剪映字幕的工作目录是:USER_HOME+'\AppData\Local\JianyingPro\UserData\Projects\com.lveditor.draft';macOS上,剪映字幕的工作目录是... 查看详情

如何把字幕和视频合成到一个文件?

不需要重新压制吧?可以使用【格式工厂】来将字幕和视频合成,具体方法为:1.首先打开下载安装好的【格式工厂】,然后点击软件首页的【视频】开始选择需要加入字幕的视频文件。2.接着在弹出的文件选择窗口选择需要处... 查看详情

将字幕 (srt) 文件添加到现有 mkv 文件

】将字幕(srt)文件添加到现有mkv文件【英文标题】:Addsubtile(srt)filetoexistingmkvfile【发布时间】:2016-12-0319:58:40【问题描述】:是否可以将字幕文件(srt)添加到现有mkv文件?我可以轻松地将srt文件嵌入到newmkv文件中,但这非常耗时... 查看详情

srt字幕格式(代码片段)

...:2019-03][状态:Open][关键词:字幕,SRT,文件格式]0引言视频文件中最简单、最常见的外挂字幕格式是SRT(SubRipText)。本人找了好久也没找到类似的标准文档,从wiki等资料来看,SRT格式是SubRip软件所生成从DVD或视频文件提取的... 查看详情

如何在 Vitamio 中启用字幕 (SRT) 支持?

】如何在Vitamio中启用字幕(SRT)支持?【英文标题】:Howtoenablesubtitle(SRT)supportinVitamio?【发布时间】:2013-07-1015:11:14【问题描述】:我确实尝试了所有方法,但我的SubRip字幕无法在Vitamio中工作。是否可能是因为流式传输视频时不支... 查看详情

VLC无法显示SubRip(srt)文件中的字幕[关闭]

...【问题描述】:我在Udacity中下载了课程HowtoUseGitandGithub的视频和字幕,发现视频播放器中只显示时间戳而不是字幕VLC.VLC似乎不完全支持Udacity的srt文件格式。那么有什么 查看详情

如何在视频中添加字幕

用timemachine在ppt里面加载的视频上添加字幕,用STAMP:SubtitlingAdd-InforPowerPoint:http://www.xuexila.com/ppt/jichu/1697130.html  查看详情

如何使用 ffmpeg 将 .srt 文件转换为基于 ttml 的 xml 字幕文件?

】如何使用ffmpeg将.srt文件转换为基于ttml的xml字幕文件?【英文标题】:Howtoconvert.srtfileintottmlbasedxmlsubtitlefileusingffmpeg?【发布时间】:2021-10-0504:21:25【问题描述】:我有一个.srt字幕文件。我想使用ffmpeg命令将其转换为.ttml格式(... 查看详情