2014-12-17 17 views
9

Tôi hiện đang sử dụng FFMPEG để nhúng phụ đề vào tệp MP4 của mình và tôi cố gắng tìm hiểu cách tùy chỉnh đặt thẻ siêu dữ liệu "handler_name" trên dòng phụ đề của mình Tôi có thể kiểm soát tên được hiển thị khi chọn phụ đề trong một trình phát như MPC-HC (Media Player Classic)?Cách đặt siêu dữ liệu handler_name tùy chỉnh cho luồng phụ đề bằng FFMPEG

lệnh hiện tại của tôi để nhúng phụ đề là:

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" 

Output:

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% 

Lệnh hoàn thành thành công, nhưng khi tôi chạy:

ffmpeg -i "C:\path\to\subbed_video.mp4" 

nó cho thấy:

Stream #0:2(eng): Subtitle: mov_text (tx3g/0x67337874), 0 kb/s (default) 
Metadata: 
    handler_name : SubtitleHandler 

Mặc dù sản lượng từ lệnh cho thấy:

Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0]/0x0008) (default) 
Metadata: 
    handler_name : English 
    encoder   : Lavc56.15.100 mov_text 

Không có vấn đề gì tùy chọn Tôi đã thử hoặc theo thứ tự nào tôi đặt các thẻ -metadata trong, thẻ này chỉ đơn giản là sẽ không được thiết lập với FFMPEG? Tôi thấy nó thực sự xấu xí khi thấy SubtitleHandler [eng] (tx3g) (Tiếng Việt) trong trình đơn của trình phát thay vì chỉ cần nói Tiếng Anh.

Bây giờ, tôi có thể làm việc xung quanh vấn đề này bằng cách sử dụng MP4BOX để nhúng phụ đề vào mp4 của tôi bằng cách sử dụng:

MP4BOX -lang eng -add "video.srt:name=English" "video.mp4" -out "subbed_video.mp4" 

Thêm "name = tiếng Anh" cho phép tôi để thiết lập "handler_name" dòng phụ đề để "Anh"; hiển thị hoàn hảo ở FFMPEGMPC-HC, nhưng vấn đề là tôi không muốn ứng dụng của tôi phụ thuộc vào một công cụ bổ sung bên ngoài như MP4BOX nếu nó có thể tránh được?

tôi rất nhiều sẽ đánh giá cao bất kỳ lời khuyên về làm thế nào để thiết lập đúng các "handler_name" tag vào hoạt động phụ đề của tôi sử dụng FFMPEG, hoặc có thể là một xác nhận về việc liệu FFMPEG thậm chí có thể xử lý các thẻ này thấy như nó không phải là về mặt kỹ thuật được liệt kê trong FFMPEG's valid metadata tag list?

P.S. Để thay thế cho FFMPEG, tôi sẵn sàng sử dụng AtomicParsley để đặt "handler_name" vì tôi đã sử dụng nó để đặt siêu dữ liệu nâng cao trên "subbed_video.mp4" sau khi tôi nhúng phụ đề. Nó có vẻ như nó sẽ có thể làm với AtomicParsley, nhưng tôi đã không thể hiểu một nửa thông tin trợ giúp liên quan đến việc thiết lập tùy chỉnh của ATOM.

TIA !!

+0

Tôi cũng nên đề cập đến rằng đây đã được thử nghiệm với 64-bit build (git-92a596f mới nhất (2014/12/16)) từ đây: http://ffmpeg.zeranoe.com/builds/ – AWainb

Trả lời

8

Cuối cùng figured it out ngày hôm nay, và tôi không thể tin rằng tôi đã không cố gắng này trước khi ... Mặc dù tên thẻ được liệt kê như handler_name = sản lượng FFMPEG của, thẻ tích cực sử dụng chỉ là handler =, mà không cần thêm _name.

-metadata: s: s: 0 handler = "tiếng Anh"

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" 
+2

Bạn cũng có thể sử dụng bên dưới để thay đổi tên được hiển thị cho các kênh âm thanh: * (giả sử tệp có hai luồng âm thanh, Âm thanh nổi và Âm thanh vòm 5.1) * ** - siêu dữ liệu: s: a: 0 handler = "Tiếng Anh (Âm thanh nổi)" ** ** - siêu dữ liệu: s: a: 1 handler = "Tiếng Anh (Surround 5.1)" ** – AWainb

+0

là có cách nào để xóa thẻ handler_name này hoàn toàn? Tôi để trống nhưng không làm được, tôi dùng -1 và không có gì. – Felipe

+0

Bạn tìm thấy tên của thẻ ở đâu là 'handler'? Có danh sách các tên thẻ này với ý nghĩa của chúng không? Tôi đang tìm kiếm cách thêm thời gian "phương tiện đã tạo", nhưng chưa thể tìm thấy tên thẻ chính xác ... – anishsane

Các vấn đề liên quan