2014-12-17 17 views
9

Attualmente sto usando FFMPEG per incorporare i sottotitoli nei miei file MP4 e sono perplesso nel tentativo di capire come personalizzare il tag metadata "handler_name" sul mio flusso di sottotitoli in modo Posso controllare il nome visualizzato quando si selezionano i sottotitoli in un player come MPC-HC (Media Player Classic)?Come impostare i metadati di handler_name personalizzati per il flusso di sottotitoli usando FFMPEG

mio comando corrente per incorporare il sottotitolo è:

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" 

uscita:

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% 

Il comando viene completato con successo, ma quando ho eseguito:

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

mostra:

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

Anche se l'output del comando mostra:

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

Non importa quello che le opzioni che ho provato o che ordine ho posto i tag -metadata in, questo tag semplicemente non impostato con FFMPEG? Trovo davvero brutto vedere SubtitleHandler [ita] (tx3g) (inglese) nel menu del mio lettore invece di dire semplicemente inglese.

Ora, posso risolvere questo problema utilizzando MP4BOX per incorporare i sottotitoli in di usando il mio mp4:

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

Aggiunta "name = inglese" mi permette di impostare "handler_name" del flusso dei sottotitoli per "Inglese"; che si visualizza perfettamente in FFMPEG e MPC-HC, ma il problema è che non voglio che la mia app sia dipendente da uno strumento esterno aggiuntivo come MP4BOX se può essere evitato?

Io apprezzo molto qualche consiglio su come impostare correttamente il tag "handler_name" sul mio flusso dei sottotitoli utilizzando FFMPEG, o forse una conferma dell'esistenza o meno FFMPEG può anche gestire questo tag visto che non è tecnicamente elencato nella FFMPEG's valid metadata tag list?

P.S. In alternativa a FFMPEG, sarei disposto a utilizzare AtomicParsley per impostare "nome_handler" poiché lo userò già per impostare i metadati avanzati su "subbed_video.mp4" dopo aver incorporato i sottotitoli. Sembra che sarebbe possibile fare con AtomicParsley, ma non sono stato in grado di capire la metà delle informazioni di aiuto per quanto riguarda l'impostazione di ATOM personalizzati.

TIA !!

+0

Vorrei anche ricordare che questo è stato testato con l'ultima a 64-bit build (git-92a596f (2014/12/16)) da qui: http://ffmpeg.zeranoe.com/builds/ – AWainb

risposta

8

finalmente capito che oggi, e non posso credere che non ho provato questo prima ... Anche se il nome del tag è elencato come handler_name = in uscita di FFmpeg, il tag attivo da utilizzare è solo handler =, senza aggiungere _nome.

-metadata: s: s: 0 handler = "inglese"

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

Puoi anche usare il sotto per cambiare il nome che viene visualizzato per i canali audio: * (supponendo che il file abbia due flussi audio, Stereo e Surround 5.1) * ** - metadati: s: a: 0 handler = "Inglese (Stereo)" ** ** - metadati: s: a: 1 gestore = "Inglese (Surround 5.1)" ** – AWainb

+0

c'è un modo per eliminare questo tag handler_name completamente? L'ho lasciato vuoto ma non l'ho fatto, ho usato -1 e niente. – Felipe

+0

Dove hai trovato che il nome del tag è 'handler'? C'è un elenco di questi nomi di tag con i loro significati? Sto cercando un modo per aggiungere il tempo "media creato", ma non riesco a trovare il nome corretto del tag ... – anishsane