Metin altyazıları eklemek için ffmpeg kullanın [kapalı]


122

Ffmpeg kullanarak bir .mp4 kapsayıcısına metin altyazıları eklemeye çalışıyorum:

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

Bu satırı çalıştırmaya çalıştığımda bana bir hata veriyor:

Akış haritalarının sayısı, çıktı akışlarının sayısıyla eşleşmelidir.

Mp4'ü mkv olarak değiştirmeye çalışırsam (mp4 metin altyazılarını desteklese de), şöyle:

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

Akışları doğru bir şekilde eşler, ancak bir hata verir:

Kodlayıcı (kodek kimliği 94210), # 0.2 çıkış akışı için bulunamadı

Başlattığımda

ffmpeg -codecs

Srt codec'in kod çözücü ve kodlayıcı olarak desteklendiğini görebiliyorum, ancak mp4 ve mkv subs kodlaması için ne kullanıldığından ve onu açmam veya ayrı ayrı derlemem gerekip gerekmediğinden emin değilim.

Yanıtlar:


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

-vf subtitles=infile.srt ile çalışmayacak -c copy


Sırası -c copy -c:s mov_textönemlidir. FFmpeg'e söylüyorsunuz:

  1. Video: kopya, Ses: kopya, Altyazı: kopya
  2. Alt başlık: mov_text

Bunları tersine çevirirseniz, FFmpeg'e şunu söylersiniz:

  1. Alt başlık: mov_text
  2. Video: kopya, Ses: kopya, Altyazı: kopya

Alternatif olarak -c:v copy -c:a copy -c:s mov_text, herhangi bir sırayla kullanabilirsiniz .


13
Bu yöntem, akıştan biri olarak dosyaya altyazı ekler, bu nedenle altyazıyı göstermek için oynatıcı desteğine ihtiyaç duyar (VLC gibi)
BollMose

1
Bu, altyazının mevcut olduğu ancak videoya yazılmadığı anlamına mı geliyor? Talep üzerine istersem gösterebilir miyim?
Paz

3
Evet @ sunk818 bunun anlamı bu. Bu, altyazıyı oynatıcı desteklediği sürece etkinleştirilebilen veya devre dışı bırakılabilen bir parça olarak ekler. Bay Hyde ve Paul ffmpeg ayrıca videonun üstüne altyazıları ekleyebilir ve bu durumlarda yazı tipi ve konumlandırma gibi şeyleri kontrol edersiniz.
Boushley

1
.srt dosyaları ile -c:s copydeğil içe aktarılmalıdır -c:s mov_text.
GetFree

82

NOT: Bu çözüm videoya "altyazıları yazar", böylece videoyu görüntüleyen her kişi onları görmeye zorlanacaktır.

libassKitaplığı kullanın (ffmpeg kurulumunuzun yapılandırmada kitaplığa sahip olduğundan emin olun --enable-libass).

Önce altyazıları .assformata dönüştürün:

ffmpeg -i subtitles.srt subtitles.ass

Ardından bunları bir video filtresi kullanarak ekleyin:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4

40
Bu onları videoya "yakacak", yani oynatıcıda kapatamayacağınız anlamına gelir. Bu, oyuncu tarafından okunabilen ve izleyici isterse görüntülenebilen bir altyazı akışı olarak eklemekten farklıdır.
stib

1
Bu çözüm için çok teşekkürler. Karakterlerin boyutunu belirlemenin bir yolu var mı?
user1319182

1
Şu yanıta bir göz atın: stackoverflow.com/questions/21363334/… . Yazı tipini muhtemelen altyazı dosyasında ayarlamak isteyeceksiniz, aksi takdirde alt yazı filtresini kullanarak Yazı Tipi: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8

Bu, Instagram gibi bir yerde videolar için altyazı eklerken faydalı olacaktır. Instagram görüntüleyicisi gibi, kullanıcının ses dinleme becerisinin olmadığı veya başka bir dilde olduğu bir yerde, kullanıcı bunun yerine altyazıyı okuyabilir
ϻαϻɾΣɀО-MaMrEzO

1
libass"Apt update && apt install libass-dev" ile Debian sistemlerinde eksik uzantıları yükleyin .
Sopalajo de Arrierez

53

Altyazıları altyazı akışı olarak muxlamaya çalışıyorsunuz. Kolaydır ancak MP4 (veya M4V) ve MKV için farklı sözdizimi kullanılır. Her iki durumda da video ve ses kodekini belirtmeniz veya sadece altyazı eklemek istiyorsanız akışı kopyalamanız gerekir.

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

3
Birden fazla altyazı eklemek mümkün mü? Bu softsub bilinmeyen bir dil olarak tanınacak mı?
Patrick

1
Evet öyle. MKV için test ettim:
dotokija

7
Önce başka bir girdi ekleyin: -i input2.srt. İkinci olarak, bunu 2. akış olarak eşleyin: -map 2: 0. Son olarak, 2. altyazı akışı için kodlayıcı seçin (ilki ile aynı): -c: s srt. Tam örnek \ 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: bir kopya \ -c: s srt -c: s srt output.mkv
dotokija

8
Ve dil meta verilerini eklemek için (çıktı dosyasından önce ekleyin) "-metadata: s: s: 0 dil = eng"
Patrick

mkv dosyalarını mp4 dosyaları (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) olarak "yeniden sardığımda" orijinal dosyadaki altyazılar nasıl dışarıda kalıyor? orijinal mkv'nin altyazıları vardır, ancak mp4 formatındaki çıktı yoktur. neler oluyor? neyi doğru yapmıyorum?
oldboy

9

MKV kapsayıcı, video ve ses kodeklerini neredeyse her şeyi destekler ve ayrıca altyazıları ve DVD menülerini destekler. Böylece, kodekleri giriş videosundan, altyazılı MKV konteyneri ile çıkış videosuna kopyalayabilirsiniz. Öncelikle SRT'yi ASS altyazı formatına dönüştürmelisiniz

ffmpeg -i input.srt input.ass

ve videoya ASS altyazıları katıştırın

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

Ayrıca VMW dosyasıyla da çalıştı.

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

wiki sayfasına bakın Kapsayıcı formatlarının karşılaştırması


1
HV gerçekten alakalı değil, birden fazla çözüm görmek her zaman memnuniyetle karşılanır.
JasonXA

8

ffmpeg, mov_textbir MP4 kapsayıcısında desteklenen ve iTunes, Quicktime, iOS vb. tarafından oynatılabilen altyazı kodlayıcıyı destekler.

Satırın şöyle olacaktır:

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


5

Bu görev için MP4Box kullanmayı denedim, ancak uğraştığım M4V'yi kaldıramadı. SRT'yi aşağıdaki komut satırıyla ffmpeg ile yumuşak altyazılar olarak yerleştirmeyi başardım:

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

Senin gibi bir MKV çıktı dosyası kullanmak zorunda kaldım - M4V dosyası oluşturamadım.


3

Herhangi bir sayıda ses ve srt altyazısı ile çalışan ve mkv kapsayıcısını içerebilecek meta verilere saygı duyan basit ve genel bir cevap vereceğim . Böylece, matroska'nın ek olarak içerebileceği görüntüleri (başka bir AFAIK türü olmasa da) ekleyecek ve bunları izlere dönüştürecektir; izleyemeyeceksiniz, ancak orada olacaklar (onları parçalayabilirsiniz). Ah, ve eğer mkv'nin de mp4 bölümleri varsa .

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

Gördüğünüz gibi, bu konuda hepsi -map 0, söyler FFmpeg meta, bölümleri, ekleri vb tanınmayan bir "parça" varsa (buna, bütün parçaları eklemeye mkv eklemenize olanak herhangi dosyanın türünü), o olacak bir hatayla biter.

mkv2mp4.batGenellikle bunu yaparsanız , mkv ile aynı ada sahip bir mp4 oluşturmak için basit bir toplu iş oluşturabilirsiniz . Hata kontrolü, farklı bir çıktı adı, vb. İle daha iyi olurdu, ama sen anladın.

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

Şimdi basitçe koşabilirsiniz

mkv2mp4 "Video with subtitles etc.mkv"

Ve dahil edilen maksimum bilgi ile "Altyazılı video vb. Mp4" oluşturacaktır.


-1

Basit Örnek:

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

Yalnızca linux değişkenlerini değiştirin


Detaylandırmak ister misin?
RamenChef

-3

Mkv'nin bu kadar iyi bir kapsayıcı olmasının nedeni budur, özellikle de artık olgunlaştığı için:

mkvmerge -o output.mkv video.mp4 subtitle.srt

3
Yaklaşımınızın neden OP'nin sorununu çözeceği konusunda yorum yapmak ister misiniz?
mjuarez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.