我目前正在使用FFMPEG将字幕嵌入到我的MP4文件中,并且我很难理解如何自定义设置" handler_name"我的字幕流上的元数据标签,以便我可以控制在MPC-HC(媒体播放器经典)等播放器中选择字幕时显示的名称?
我目前嵌入副标题的命令是:
ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 handler_name="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"
输出:
C:\path\to>ffmpeg -y -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language="eng" -metadata:s:s:0 handler_name="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"
ffmpeg version N-68482-g92a596f Copyright (c) 2000-2014 the FFmpeg developers
built on Dec 16 2014 02:53:08 with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable
libavutil 54. 15.100 / 54. 15.100
libavcodec 56. 15.100 / 56. 15.100
libavformat 56. 15.105 / 56. 15.105
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 3.101 / 5. 3.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.34.101
Duration: 01:27:44.17, start: 0.000000, bitrate: 878 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x536 [SAR 1:1 DAR 160:67], 842 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 32 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
Metadata:
handler_name : SubtitleHandler
Input #1, srt, from 'video.srt':
Duration: N/A, bitrate: N/A
Stream #1:0: Subtitle: subrip
Output #0, mp4, to 'subbed_video.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.15.105
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x536 [SAR 1:1 DAR 160:67], q=2-31, 842 kb/s, 24 fps, 24 tbr, 12288 tbn, 12288 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 32 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008) (default)
Metadata:
handler_name : English
encoder : Lavc56.15.100 mov_text
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (mov_text (native) -> mov_text (native))
Press [q] to stop, [?] for help
frame=126337 fps=13751 q=-1.0 Lsize= 564499kB time=01:27:44.17 bitrate= 878.5kbits/s
video:541239kB audio:20564kB subtitle:39kB other streams:0kB global headers:0kB muxing overhead: 0.472881%
命令成功完成,但是当我运行时:
ffmpeg -i "C:\path\to\subbed_video.mp4"
它显示:
Stream #0:2(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
Metadata:
handler_name : SubtitleHandler
即使命令的输出显示:
Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008) (default)
Metadata:
handler_name : English
encoder : Lavc56.15.100 mov_text
无论我尝试了哪些选项或将-metadata标记放在哪个顺序,此标记都不会设置为FFMPEG?我觉得在我的播放器菜单中看到 SubtitleHandler [eng](tx3g)(英文)非常难看,而不是简单地说英文。
现在,我可以使用MP4BOX将字幕嵌入我的mp4中来解决此问题:
MP4BOX -lang eng -add "video.srt:name=English" "video.mp4" -out "subbed_video.mp4"
添加" name = English" 可让我设置字幕流" s" handler_name"到"英语&#34 ;;它在FFMPEG和MPC-HC中完美显示,但问题是我不希望我的应用依赖于MP4BOX之类的其他外部工具(如果可以避免的话)?
我非常感谢有关如何正确设置" handler_name"的任何建议。使用FFMPEG标记我的字幕流,或者确认FFMPEG是否可以处理此标记,因为它在技术上没有列在FFMPEG's valid metadata tag list中?
P.S。作为FFMPEG的替代方案,我愿意使用AtomicParsley来设置" handler_name"因为我已经用它来设置" subbed_video.mp4"的高级元数据。我嵌入字幕后。看起来似乎可以使用AtomicParsley,但我无法理解有关设置自定义ATOM的一半帮助信息。
TIA !!
答案 0 :(得分:10)
今天终于搞清楚了,我不敢相信我之前没试过......虽然标签名称在FFMPEG的输出中列为 handler_name = ,要使用的有效代码只是 handler = ,而不添加 _name 。
-metadata:s:s:0 handler =“English”
ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 handler="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"
答案 1 :(得分:0)
如果您正在使用VLC并且接受的答案不起作用,则应将title
选项添加到流元数据中。使用OP示例:
ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"
其他流也一样。在FFmpeg版本N-79630-g9ac154d上测试。
答案 2 :(得分:0)
我没有使用 ffmpeg 设置字幕(或音频)流的标签,至少不是以播放器显示的方式。经过大量研究,似乎 vlc 和其他播放器显示的流标签根本不是基于处理程序,而是基于 mp4/QuickTime 元数据中的 UDTA 名称原子。
我能找到的唯一一个能够以 VLC 和其他播放器显示的方式可靠地设置 UDTA 名称而无需重新编码或添加新流的工具是 GPAC/mp4box,这只是最近添加的(2020 年 10 月)功能:
MP4Box -udta TRACKID:type=name:str="Track Label" file.mp4