Gunakan ffmpeg untuk menambahkan subtitel teks [tertutup]

122

Saya mencoba menambahkan subtitle teks ke wadah .mp4 menggunakan ffmpeg:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

Ketika saya mencoba menjalankan baris ini, itu memberi saya kesalahan:

Jumlah peta aliran harus sesuai dengan jumlah aliran keluaran.

Jika saya mencoba mengubah mp4 ke mkv (meskipun mp4 mendukung subtitle teks), seperti ini:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

Ini memetakan aliran dengan benar, tetapi memberikan kesalahan:

Encoder (codec id 94210) tidak ditemukan untuk aliran keluaran # 0.2

Saat saya meluncurkan

ffmpeg -codecs

Saya dapat melihat bahwa codec srt didukung sebagai decoder dan encoder, namun saya tidak yakin apa yang digunakan untuk encoding mp4 dan mkv subs, dan apakah saya perlu mengaktifkannya atau mengkompilasi secara terpisah.

0-alpha
sumber

Jawaban:

196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt tidak akan bekerja dengan -c copy


Urutan -c copy -c:s mov_textpenting. Anda memberi tahu FFmpeg:

  1. Video: salin, Audio: salin, Subtitle: salin
  2. Subjudul: mov_text

Jika Anda membalikkannya, Anda memberi tahu FFmpeg:

  1. Subjudul: mov_text
  2. Video: salin, Audio: salin, Subtitle: salin

Atau Anda bisa menggunakan -c:v copy -c:a copy -c:s mov_textdalam urutan apa pun.

Steven Penny
sumber
13
Metode ini menambahkan subtitle ke file sebagai salah satu streaming, jadi perlu dukungan pemain untuk menampilkan subtitle (seperti VLC)
BollMose
1
Apakah ini berarti subtitel tersedia, tetapi tidak disisipkan ke dalam video? Saya dapat menunjukkan jika saya ingin sesuai permintaan?
Minggu
3
Ya @ sunk818 itulah artinya. Ini menambahkan subtitle sebagai trek yang dapat diaktifkan atau dinonaktifkan selama pemain mendukungnya. Tn. Hyde dan Paul ffmpeg juga dapat menambahkan subtitle di atas video itu sendiri, dan dalam kasus tersebut Anda akan mengontrol hal-hal seperti font dan pemosisian.
Boushley
1
File .srt harus diimpor dengan -c:s copybukan dengan -c:s mov_text.
Dapatkan Gratis
82

CATATAN: Solusi ini "membakar teks film" ke dalam video, sehingga setiap pemirsa video akan dipaksa untuk melihatnya.

Gunakan libasspustaka (pastikan pemasangan ffmpeg Anda memiliki pustaka dalam konfigurasi --enable-libass).

Pertama, ubah subtitle ke .assformat:

ffmpeg -i subtitles.srt subtitles.ass

Kemudian tambahkan menggunakan filter video:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
sumber
40
Ini akan "membakarnya ke" video, artinya Anda tidak dapat mematikannya di pemutar. Ini berbeda dengan menambahkannya sebagai aliran subtitle yang dapat dibaca oleh pemain dan ditampilkan jika pemirsa menginginkannya.
stib
1
Terima kasih banyak untuk solusi ini. Apakah ada cara untuk menentukan ukuran karakter?
pengguna1319182
1
Lihatlah jawaban ini: stackoverflow.com/questions/21363334/… . Anda mungkin ingin mengatur fonta di file subtitle itu sendiri, jika tidak menggunakan filter subtitle, Anda dapat memaksa_style untuk mengatur Font: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8
Ini akan berguna saat menambahkan subtitle untuk video di suatu tempat seperti Instagram. Di suatu tempat seperti penampil Instagram yang pengguna tidak memiliki kemampuan untuk mendengarkan suara atau video dalam bahasa lain, maka pengguna dapat membaca subtitle sebagai gantinya
ϻαϻɾΣɀО-MaMrEzO
1
Instal libassekstensi jika tidak ada di sistem Debian dengan `apt update && apt install libass-dev".
Sopalajo de Arrierez
53

Anda mencoba untuk mengubah subtitle sebagai aliran subtitle. Mudah tetapi sintaks yang berbeda digunakan untuk MP4 (atau M4V) dan MKV. Dalam kedua kasus, Anda harus menentukan codec video dan audio, atau cukup salin streaming jika Anda hanya ingin menambahkan subtitle.

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv
dotokija
sumber
3
Apakah mungkin menambahkan lebih dari satu subtitle? Akankah softsub ini dikenali sebagai bahasa tidak dikenal?
Patrick
1
Ya itu. Saya baru saja mengujinya untuk MKV:
dotokija
7
Pertama tambahkan input lain: -i input2.srt. Kedua, petakan itu sebagai aliran kedua: -map 2: 0. Terakhir, pilih pembuat enkode untuk aliran subtitle kedua (sama seperti yang pertama): -c: s srt. Contoh lengkap \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: v copy - c: salinan \ -c: s srt -c: s srt output.mkv
dotokija
8
Dan untuk menambahkan metadata bahasa (masukkan sebelum file keluaran) "-metadata: s: s: 0 language = eng"
Patrick
kenapa subtitle dalam file aslinya dikecualikan ketika saya "membungkus ulang" file mkv sebagai file mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? mkv asli memiliki teks film tetapi keluaran dalam format mp4 tidak. apa yang sedang terjadi? apa yang tidak saya lakukan dengan benar?
oldboy
9

Kontainer MKV mendukung codec video dan audio Hampir apa saja dan juga mendukung subtitle dan menu DVD. Jadi Anda cukup menyalin codec dari video input ke video output dengan wadah MKV dengan subtitle. Pertama Anda harus mengonversi SRT ke format subtitle ASS

ffmpeg -i input.srt input.ass

dan menyematkan subtitel ASS ke video

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

Juga bekerja dengan file VMW.

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

lihat halaman wiki Perbandingan format wadah

khan
sumber
1
HV tidak terlalu relevan, selalu disambut untuk melihat lebih dari satu solusi.
JasonXA
8

ffmpeg mendukung mov_textencoder subtitle yang merupakan satu-satunya yang didukung dalam wadah MP4 dan dapat dimainkan oleh iTunes, Quicktime, iOS dll.

Baris Anda akan berbunyi:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4

Mirko Klemm
sumber
5

Saya mencoba menggunakan MP4Box untuk tugas ini, tetapi tidak dapat menangani M4V yang saya tangani. Saya berhasil menyematkan SRT sebagai subtitle lembut dengan ffmpeg dengan baris perintah berikut:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

Seperti Anda, saya harus menggunakan file keluaran MKV - saya tidak dapat membuat file M4V.

D Coetzee
sumber
3

Saya akan memberikan jawaban sederhana dan umum yang berfungsi dengan sejumlah subtitle audio dan srt dan menghormati metadata yang mungkin menyertakan penampung mkv . Jadi bahkan akan menambahkan gambar yang mungkin termasuk matroska sebagai lampiran (meskipun bukan jenis AFAIK lain) dan mengubahnya menjadi trek; Anda tidak akan dapat menonton tetapi mereka akan ada di sana (Anda dapat mendemuxnya). Ah, dan jika mkv memiliki bab, mp4 juga.

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

Seperti yang Anda lihat, ini semua tentang -map 0, yang memberi tahu FFmpeg untuk menambahkan semua trek, yang mencakup metadata, bab, lampiran, dll. Jika ada "trek" yang tidak dikenal ( mkv memungkinkan untuk melampirkan semua jenis file), itu akan diakhiri dengan kesalahan.

Anda dapat membuat kumpulan sederhana mkv2mp4.bat, jika biasanya Anda melakukan ini, untuk membuat mp4 dengan nama yang sama dengan mkv . Akan lebih baik dengan kontrol kesalahan, nama keluaran yang berbeda, dll, tetapi Anda mengerti maksudnya.

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

Sekarang Anda bisa langsung lari

mkv2mp4 "Video with subtitles etc.mkv"

Dan itu akan membuat "Video dengan subtitle etc.mp4" dengan informasi maksimum yang disertakan.

cdlvcdlv.dll
sumber
-1

Contoh Sederhana:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

Hanya ganti variabel linux

Daniel Gianni
sumber
Mau menjelaskan lebih lanjut?
RamenChef
-3

Inilah alasan mengapa mkv adalah wadah yang bagus, terutama sekarang setelah matang:

mkvmerge -o output.mkv video.mp4 subtitle.srt
Corley Kinnane
sumber
3
Mau berkomentar tentang mengapa pendekatan Anda akan memperbaiki masalah OP?
mjuarez