如何使用FFMPEG为字幕流设置自定义handler_name元数据

时间:2014-12-17 04:37:24

标签: video ffmpeg metadata subtitle

我目前正在使用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 ;;它在FFMPEGMPC-HC中完美显示,但问题是我不希望我的应用依赖于MP4BOX之类的其他外部工具(如果可以避免的话)?

我非常感谢有关如何正确设置" handler_name"的任何建议。使用FFMPEG标记我的字幕流,或者确认FFMPEG是否可以处理此标记,因为它在技术上没有列在FFMPEG's valid metadata tag list中?

P.S。作为FFMPEG的替代方案,我愿意使用AtomicParsley来设置" handler_name"因为我已经用它来设置" subbed_video.mp4"的高级元数据。我嵌入字幕后。看起来似乎可以使用AtomicParsley,但我无法理解有关设置自定义ATOM的一半帮助信息。

TIA !!

3 个答案:

答案 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