07-----给音视频文件添加字幕流

添加字幕流可以使用ACHTIME软件去添加。

一 下载ACHTIME软件

在下载之前我们需要注册一个账号。然后才能下载。
http://arctime.cn/download.html

二 添加字幕流

我们知道字幕流分为外挂字幕、软字幕、硬字幕,我们这里因为想要在代码测试。所以需要的是软字幕。关于字幕更多的理论可以看这篇文章:ffmpeg-给视频添加字幕(二十四)

2.1

首先找一个不带字幕流(外挂、软、硬均没有)的视频文件,可以使用vlc去看。例如我的视频文件:
下面看到只有视频和音频流,并没有字幕流。

在这里插入图片描述

2.2

然后打开ACHTIME软件,按照这篇文章去生成字幕即可。
使用Arctime生成各种格式的字幕文件

此时再用VLC播放本视频文件,就可以看到多了字幕流。
在这里插入图片描述

实际上我们在插入空白字幕的时候,发现生成的ass字幕文件中,字幕是2s的显示时长。srt字幕文件也同理。
在这里插入图片描述

但是我在使用ffplay去debug的时候,并未看到有字幕流,使用ffprobe同理。
命令:

ffprobe.exe sintel.mp4

在这里插入图片描述
结果只看到视频流和音频流,并未有字幕流,那为啥vlc看到的信息又有字幕流呢?
答:这是因为这个文件实际并没有字幕流,vlc能看到信息是因为vlc的信息查找做得比较细,因为这个信息是ARCTIME工程生成的,所以vlc能看到,ffprobe看不到。这是不同播放器的检测差异造成的。
如果此时你将这个mp4的文件路径移动其它目录,例如桌面,那么此时不管是使用vlc还是ffplay,都是没有字幕信息的。

然后如果我们使用vlc和ffplay去播放,发现vlc显示的画面都能看到字幕,ffplay不能,这一点又是挺奇怪的?
答:实际上同理,这是因为我在使用ARHTIME时,在该目录生成了一个工程,所以直接播放使用ACHTIME修改过的那个路径下的mp4文件,vlc搜索做得细,可以看到显示的画面有字幕。但是ffpaly播放不会显示字幕。
如果此时你将这个mp4的文件路径移动其它目录,例如桌面,那么此时不管是使用vlc还是ffplay,都是没有字幕的。

这两个问题实际上是一致的,因为在我未理解之前,未能很好区分它们。

2.3

经过上一步处理并未能达到我的要求,因为使用ffplay debug却没有字幕流,这不是我想要的,所以我需要去转换格式,因为我想用mp4文件debug,所以使用ffmpeg去将字幕流格式转成mov_text格式。

ffmpeg -i sintel.mp4 -i ./sintel_Subtitle_Export/sintel.srt -c copy -c:s mov_text sintel-sub.mp4

此时使用ffprobe就可以看到对应的字幕流,ffplay debug时也能进入字幕流的逻辑,说明没问题的。
在这里插入图片描述

但是vlc、ffplay播放时会没有字幕:
vlc解决:因为vlc默认是隐藏软字幕的,所以需要手动开启。选择:字幕->字幕轨道->轨道1,即可开启。
在这里插入图片描述

ffplay暂时未知道如何处理。

三 其它

如果在添加字幕后,使用播放器播放仍然没有字幕,可以参考这篇文章看看什么原因。使用FFmpeg命令给视频文件添加软字幕并解决播放器播放没有出现字幕的问题

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现上传视频并且利用百度语音识别API给视频添加字幕,需要完成以下几个步骤: 1. 在 Android Studio 中创建一个上传视频的功能,可以使用第三方库,例如 retrofit 或者 volley,实现上传视频到服务器。 2. 调用百度语音识别 API,将上传的视频进行语音识别,得到视频中的语音内容。 3. 将语音内容转化为字幕格式,例如 SRT 格式。 4. 将字幕文件与上传的视频进行合并,生成新的视频文件。 下面是大致的代码实现步骤: 1. 上传视频到服务器 ``` // 创建 Retrofit 实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://your.server.url/") .build(); // 创建 API 接口 VideoUploadApi api = retrofit.create(VideoUploadApi.class); // 创建 FileRequestBody,用于上传视频文件 FileRequestBody fileRequestBody = new FileRequestBody(videoFile); // 调用 API 接口上传视频 Call<UploadResult> call = api.uploadVideo(fileRequestBody); call.enqueue(new Callback<UploadResult>() { @Override public void onResponse(Call<UploadResult> call, Response<UploadResult> response) { // 上传成功 UploadResult result = response.body(); // 处理上传结果 } @Override public void onFailure(Call<UploadResult> call, Throwable t) { // 上传失败 // 处理上传失败的情况 } }); ``` 2. 调用百度语音识别 API ``` // 创建百度语音识别 API 实例 BaiduSpeechApi api = new BaiduSpeechApi(appId, appKey, secretKey); // 调用语音识别 API,获取语音内容 String speechContent = api.recognizeSpeech(videoFile); ``` 3. 将语音内容转化为字幕格式 ``` // 将语音内容转化为 SRT 格式字幕 String srtSubtitle = SrtSubtitleConverter.convertToSrt(speechContent); ``` 4. 将字幕文件与上传的视频进行合并 ``` // 创建 FFmpeg 实例 FFmpeg ffmpeg = FFmpeg.getInstance(context); // 设置 FFmpeg 命令行 String command = String.format("ffmpeg -i %s -vf subtitles=%s %s", videoFile.getAbsolutePath(), subtitleFile.getAbsolutePath(), outputVideoFile.getAbsolutePath()); // 执行 FFmpeg 命令行 ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { @Override public void onSuccess(String message) { // 合并成功 } @Override public void onFailure(String message) { // 合并失败 } }); ``` 以上是大致的实现步骤,具体实现细节还需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值