Pertanyaan Apakah ada opsi di ffmpeg untuk menentukan trek subtitle yang seharusnya ditampilkan secara default?


Saya memiliki video dalam format MP4 yang didominasi bahasa Inggris, tetapi memiliki adegan di mana seorang karakter berbicara bahasa lain. Saya memiliki trek subtitle bahasa Inggris dalam format SRT untuk dialog karakter ini. Apakah mungkin untuk menyematkan trek subtitle di MP4 itu sendiri dan mengaktifkannya secara default tanpa harus mengaktifkannya secara manual. Dengan perintah yang saya gunakan saat ini (di bawah), trek subtitle ditambahkan ke file, tetapi saya harus memilihnya secara manual saat memutar video.

ffmpeg -i movie.mp4 -i movie.srt -c:v copy -c:a copy -c:s mov_text \
  -metadata:s:s:0 language=eng movie-sub.mp4

Apakah ada beberapa metadata lain yang perlu saya tambahkan agar subs dapat muncul secara default? Saya ingin menghindari subs yang keras jika memungkinkan. Jika ini adalah batasan dari kontainer MP4, saya akan baik-baik saja dengan beralih ke format lain seperti MKV.

Output dari ffmpeg:

ffmpeg version 2.1.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec 31 2013 15:44:02 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libass --enable-libbluray --enable-gnutls --enable-libfreetype --disable-indev=jack --disable-outdev=xv --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-nonfree --enable-libfaac
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-03-18 08:10:43
  Duration: 01:37:23.05, start: 0.000000, bitrate: 1877 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1683 kb/s, 23.98 fps, 23.98 tbr, 48k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
Input #1, srt, from 'movie.srt':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Subtitle: subrip
Output #0, mp4, to 'movie-sub.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf55.19.104
    Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=2-31, 1683 kb/s, 23.98 fps, 48k tbn, 48k tbc (default)
    Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 191 kb/s (default)
    Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008)
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #1:0 -> #0:2 (subrip -> mov_text)
Press [q] to stop, [?] for help
frame=140093 fps=9457 q=-1.0 Lsize= 1340911kB time=01:37:23.04 bitrate=1880.0kbits/s    
video:1200658kB audio:136946kB subtitle:0 global headers:0kB muxing overhead 0.247196%

2
2018-01-11 02:44


asal


Pemain apa yang Anda uji? - LordNeckbeard
Saya telah mencoba QuickTime dan VLC. Keduanya mengharuskan saya memilih trek subtitle secara manual. - Sean
Saya pikir ini tergantung pada pemain. VLC saya benar-benar akan menampilkan semua terjemahan secara default. Saya ingat saya selalu harus mematikannya. Bisakah Anda membuat salinan singkat dari file dengan ffmpeg -i movie-sub.mp4 -c copy -map 0 -t 1 out.mp4 dan mengunggahnya ke suatu tempat? - slhck


Jawaban:


Tidak, tidak ada pilihan di ffmpeg untuk menentukan trek subtitle yang seharusnya ditampilkan secara default.

(ffmpeg versi 2.6.1 dibangun dengan gcc 4.9.2 (GCC) 20150304 (pra-rilis) sebagai default di Arch, lihat akhir jawaban untuk mengkompilasi flag)

Sumber daya yang menyoroti kurangnya opsi baris perintah untuk pengaturan aliran subtitle bawaan / paksa di ffmpeg meliputi yang berikut:

Akhirnya, pertanyaan ini di StackOverflow meminta yang sama seperti Anda tetapi untuk mkv, dan menyoroti fakta bahwa ffmpeg adalah pelakunya sejak mkvpropedit (bagian dari mkvtoolnix) dapat melakukannya.

Namun, ada solusi yang potensial

Laporan bug ffmpeg Maret 2013 ini  (masih terbuka) berurusan dengan mkv dan bendera default untuk subtitle dan menjelaskan sesuatu yang dapat kita gunakan untuk menghindari keterbatasan ini dalam beberapa skenario:

Spesifikasi Matroska - â € <http://matroska.org/technical/specs/index.html (cari FlagDefault) - menentukan bahwa nilai untuk flag default adalah "default" jika tidak ada yang ditentukan, demuxer itu menandai semua track subtitle sebagai "default".

Jadi ffmpeg mungkin tulis bendera default pada aliran subtitel kami dalam beberapa kasus; Saya mencoba dengan file video masukan yang berbeda dan mendapat hasil yang beragam:

  • dengan Big Buck Bunny AVI Mpeg4 dan file .srt acak, streaming subtitel mkv yang di-remux melakukan memiliki bendera default:

    $ ffmpeg -i big_buck_bunny_480p_surround-fix.avi -i subtitle.srt -c copy test.mkv
    $ ffmpeg -i test.mkv
    Input #0, matroska,webm, from 'test.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 1028 kb/s
        Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 24 fps, 24 tbr, 1k tbn, 24 tbc (default)
        Stream #0:1: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default)
        Stream #0:2: Subtitle: subrip (default)
    
  • namun saya tidak dapat mereproduksi ini dengan sampel sampel H264 yang mengandung mp4 tidak dengan mp4 pribadi, jadi saya kira mp4 --> mkv tidak berfungsi. Tetapi bagaimana jika ...?

    $ ffmpeg -i sample.mp4 -c copy sample.avi
    $ ffmpeg -i sample.avi -i subtitle.srt -c copy sample.mkv
    $ ffmpeg -i sample.mkv
    ...
    Input #0, matroska,webm, from 'sample.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 2 kb/s
        Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(tv, bt709), 560x320, SAR 1:1 DAR 7:4, 60 fps, 60 tbr, 1k tbn, 60 tbc (default)
        Stream #0:1: Audio: aac (LC), 48000 Hz, mono, fltp (default)
        Stream #0:2: Subtitle: subrip (default)
    

KEMENANGAN! Perbuatan mp4 --> avi lalu avi + srt --> mkvmembuat streaming subtitle secara default dan VLC menampilkannya dengan benar.

Tentu itu sangat bundar dan saya lebih suka tidak memikirkan kehilangan informasi dalam proses, tapi setidaknya itu berhasil.

Ringkasan

  • ffmpeg jelas tidak diadaptasi sekarang untuk mengatur aliran sebagai default atau paksa,
  • mkv mungkin lebih baik daripada mp4 sebagai wadah asal, karena ia memiliki alat yang dikenal melakukan pekerjaan dengan baik (mkvpropedit dari mkvtoolnix).
rincian versi ffmpeg:

ffmpeg versi 2.6.1 dibangun dengan gcc 4.9.2 (GCC) 20150304 (pra-rilis)     konfigurasi: --prefix = / usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gnutls --enable-gpl - mengaktifkan-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg - enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 - enable-libx265 --enable-libxvid --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab`


1
2018-05-01 12:32



Saya pikir sesuai tambalan ini ini sekarang mungkin. Setidaknya bagi saya itu berhasil ffmpeg -i in.mp4 -i in.srt -c copy -disposition:s:0 default out.mkv


Kamu dapat memakai MP4Box 0.6.2-DEV-rev453 (Mei 2016) atau lebih tinggi untuk melakukan ini:

mp4box -add alfa.mp4 -add bravo.srt:txtflags=0xC0000000 -new charlie.mp4

Contoh

Ini akan menandai aliran subtitle dalam file output sebagai paksa.

Namun, tanda ini hanya akan diakui dimulai dengan versi ini program:


Saya telah melihat sebutan untuk posting ini pada milis FFmpeg tentang a tambalan yang menerapkan disposisi untuk FFmpeg:

ffmpeg -i alfa.mp4 -i bravo.srt -c copy -c:s mov_text -disposition:s forced charlie.mp4

Namun setelah mencobanya dengan "paksa" dan "default", subtitle ditandai oleh FFmpeg tidak diakui sebagai dipaksa oleh MPC-HC atau VLC.


1
2017-11-25 22:32