使用 ffmpeg 为视频添加 SRT 字幕
Posted
技术标签:
【中文标题】使用 ffmpeg 为视频添加 SRT 字幕【英文标题】:Add SRT subtitle to video with ffmpeg 【发布时间】:2011-08-30 07:58:52 【问题描述】:我使用ffmpeg编码,并通过以下命令为视频添加字幕
$ ffmpeg -i hifi.avi -i hifi.srt -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vpre ipod640 -s 480x240 -b 256k -scodec copy hifi.m4v -newsubtitle
这是输出
ffmpeg version 0.8.git, Copyright (c) 2000-2011 the FFmpeg developers
built on Aug 4 2011 11:11:39 with gcc 4.5.2
configuration: --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --disable-shared --enable-static --enable-gpl --enable-postproc --enable-pthreads --enable-ffplay --disable-ffserver --enable-memalign-hack --enable-nonfree --enable-libfaac --arch=x86 --enable-swscale --enable-libx264 --enable-avfilter --enable-debug=3
libavutil 51. 11. 1 / 51. 11. 1
libavcodec 53. 9. 1 / 53. 9. 1
libavformat 53. 6. 0 / 53. 6. 0
libavdevice 53. 2. 0 / 53. 2. 0
libavfilter 2. 27. 5 / 2. 27. 5
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
Input #0, avi, from 'hifi.avi':
Metadata:
encoder : VirtualDubMod 1.5.4.1 (build 2178/release)
IAS1 : English
Duration: 01:49:02.20, start: 0.000000, bitrate: 897 kb/s
Stream #0.0: Video: mpeg4 (Simple Profile), yuv420p, 544x304 [SAR 1:1 DAR 34:19], 25 tbr, 25 tbn, 25 tbc
Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 32 kb/s
[srt @ 0152c100] Estimating duration from bitrate, this may be inaccurate
Input #1, srt, from 'hifi.srt':
Duration: N/A, start: 56.080000, bitrate: N/A
Stream #1.0: Subtitle: srt
File 'hifi.m4v' already exists. Overwrite ? [y/N] y
[buffer @ 02548920] w:544 h:304 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[scale @ 02558ee0] w:544 h:304 fmt:yuv420p -> w:480 h:240 fmt:yuv420p flags:0x4
[libx264 @ 02547f20] Default settings detected, using medium profile
[libx264 @ 02547f20] using SAR=1/1
[libx264 @ 02547f20] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64
[libx264 @ 02547f20] profile High, level 3.0
[libx264 @ 02547f20] 264 - core 115 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=0 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=256 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=10000 vbv_bufsize=10000 nal_hrd=none ip_ratio=1.40 aq=1:1.00
Output #0, ipod, to 'hifi.m4v':
Stream #0.0: Video: libx264, yuv420p, 480x240 [SAR 1:1 DAR 2:1], q=2-31, 256 kb/s, 90k tbn, 25 tbc
Stream #0.1: Audio: libfaac, 48000 Hz, 2 channels, s16, 128 kb/s
Stream #0.2: Subtitle: srt
Stream #0.3: Subtitle: [0][0][0][0] / 0x0000, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Stream #1.0 -> #0.2
Stream #1.0 -> #0.3
Encoder (codec id 0) not found for output stream #0.3
谁能告诉我的命令有什么问题?
【问题讨论】:
【参考方案1】:MP4 容器不支持 SubRip 字幕,只支持一种特殊的mov_text
格式。
选项1:将字幕转换为mov_text
ffmpeg -i hifi.avi -i hifi.srt -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vpre ipod640 -s 480x240 -b 256k -scodec mov_text hifi.m4v
选项 2:使用 MKV 容器
不确定 iPod 是否支持。
ffmpeg -i hifi.avi -i hifi.srt -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vpre ipod640 -s 480x240 -b 256k -scodec copy hifi.mkv
选项 3:将字幕刻录到视频中
可能需要额外的步骤才能工作,尤其是在您使用 Windows 时。请参阅https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo 了解更多信息。
ffmpeg -i hifi.avi -vf subtitles=hifi.srt -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vpre ipod640 -s 480x240 -b 256k hifi.m4v
【讨论】:
很好,我正在查看最终字幕格式是什么,正如您所说,它的 mov_text,还有其他支持 subrip 的容器吗?【参考方案2】:这是在 Windows 环境中使用 FFmpeg 将 srt 文件添加到视频的命令
ffmpeg -i Video.wmv -i hi.srt -map 0 -map 1 -c copy -crf 23 video-with-subtitles.mkv
【讨论】:
-crf 23
在使用-c copy
时会被忽略,因此您可以省略-crf 23
。您应该正确格式化您的命令,使其看起来像其他答案一样好。【参考方案3】:
似乎正在尝试添加两个字幕轨道,其中一个没有编解码器。最新版本的 ffmpeg 不使用 -newsubtitle
,所以这可能是您的问题。
尝试离开-newsubtitle
。
【讨论】:
谢谢,但它不起作用,我发现 ffmpeg 不支持 mp4 和 m4v 容器中的文本流。它确实适用于 mkv。我换成了 mplayer/mencoder。【参考方案4】:首先在你的 linux 中安装 'libass' 库。之后使用命令配置ffmpeg
./configure --enable-libass --disable-yasm --enable-libfreetype
然后将你的 srt 复制到 ffmpeg 目录中,然后使用这些命令
ffmpeg -i subtitle.srt subtitle.ass
ffmpeg -i input.flv -vf ass=subtitle.ass output.flv
【讨论】:
OP 的字幕是 SubRip 格式,而不是 Advanced SubStation。但是,如果需要刻录字幕,可以使用subtitles=hifi.srt
代替,如我的回答中所述。【参考方案5】:
更好
ffmpeg -i infile.mp4 -f srt -i infile.srt -c:v 复制 -c:a 复制 -c:s mov_text outfile.mp4【讨论】:
为什么这个“更好”? 仅供参考,您的一大堆旧答案现在正在低质量帖子审核队列中弹出,包括这个和an exact duplicate answer on another question。大多数没有上下文或解释,只是“复制并相信我”。【参考方案6】:批处理文件。
只需将 2 个文件同时放在上面 - .mp4 和 .srt 即可获得带有嵌入字幕的 .mkv 视频。
如果您想要原始/低质量的视频,只需注释/取消注释代码中的相应行。
除此之外,我还对 msgBox 进行了异步调用。谁需要它 - 将其复制到您的来源。
由于某种原因,它不接受文件名中的括号 ()。我没有检查其余的字符。
@echo off
if "%~x1"==".mp4" (
set mp4=%~n1
set path=%~d1%~p1
)
if "%~x2"==".mp4" (
set mp4=%~n2
set path=%~d1%~p1
)
if "%~x1"==".srt" set srt=%~1
if "%~x2"==".srt" set srt=%~2
if not "%mp4%"=="" (
if not "%srt%"=="" (
:: If your original ffmpeg.exe file located in system32 directory then replace "%~dp0ffmpeg.exe" to ffmpeg
:: original quality
::"%~dp0ffmpeg.exe" -i "%path%%mp4%.mp4" -i "%srt%" -ar 48000 -vcodec libx264 -disposition:s:0 default -scodec copy "%path%%mp4%.mkv"
:: low quality
"%~dp0ffmpeg.exe" -i "%path%%mp4%.mp4" -i "%srt%" -ar 48000 -ab 128k -ac 2 -vcodec libx264 -s 480x240 -b 256k -disposition:s:0 default -scodec copy "%path%%mp4%.mkv"
call :msgbox "File %path%%mp4%.mkv completed."
) else call :msgbox "File .srt missing in the input parameters`r`nJust drop 2 files with extensions:`r`n.mp4 - video and .srt - subtitles`r`nto this batch file to get .mkv with subtitles"
) else call :msgbox "File .mp4 missing in the input parameters`r`nJust drop 2 files with extensions:`r`n.mp4 - video and .srt - subtitles`r`nto this batch file to get .mkv with subtitles"
goto :eof
:msgBox [msgText]
C:\Windows\System32\mshta.exe vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -Command """"[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"""" """"[System.Windows.Forms.MessageBox]::Show(\""""%~1\"""")"""""",0,false:close")
exit /B
【讨论】:
以上是关于使用 ffmpeg 为视频添加 SRT 字幕的主要内容,如果未能解决你的问题,请参考以下文章