ใช้ ffmpeg เพื่อเพิ่มคำบรรยายข้อความ [ปิด]


122

ฉันพยายามเพิ่มคำบรรยายข้อความลงในคอนเทนเนอร์. mp4 โดยใช้ ffmpeg:

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

เมื่อฉันพยายามเรียกใช้บรรทัดนี้มันทำให้ฉันมีข้อผิดพลาด:

จำนวนแผนที่สตรีมต้องตรงกับจำนวนสตรีมเอาต์พุต

หากฉันพยายามเปลี่ยน mp4 เป็น mkv (แม้ว่า mp4 จะรองรับคำบรรยายแบบข้อความก็ตาม) เช่นนี้:

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

แมปสตรีมอย่างถูกต้อง แต่ให้ข้อผิดพลาด:

ไม่พบตัวเข้ารหัส (รหัสตัวแปลงรหัส 94210) สำหรับสตรีมเอาต์พุต # 0.2

เมื่อเปิดตัว

ffmpeg -codecs

ฉันเห็นว่าตัวแปลงสัญญาณ srt ได้รับการสนับสนุนเป็นตัวถอดรหัสและตัวเข้ารหัส แต่ฉันไม่แน่ใจว่าอะไรใช้สำหรับการเข้ารหัสย่อย mp4 และ mkv และฉันจำเป็นต้องเปิดหรือคอมไพล์แยกกัน

คำตอบ:


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

-vf subtitles=infile.srt จะไม่ทำงานกับ -c copy


ลำดับของ-c copy -c:s mov_textเป็นสิ่งสำคัญ คุณกำลังบอก FFmpeg:

  1. วิดีโอ: คัดลอก, เสียง: คัดลอก, คำบรรยาย: คัดลอก
  2. คำบรรยาย: mov_text

หากคุณย้อนกลับแสดงว่าคุณกำลังบอก FFmpeg:

  1. คำบรรยาย: mov_text
  2. วิดีโอ: คัดลอก, เสียง: คัดลอก, คำบรรยาย: คัดลอก

หรือคุณสามารถใช้-c:v copy -c:a copy -c:s mov_textในลำดับใดก็ได้


13
วิธีนี้เพิ่มคำบรรยายลงในไฟล์เป็นหนึ่งในสตรีมดังนั้นต้องการการสนับสนุนผู้เล่นเพื่อแสดงคำบรรยาย (เช่น VLC)
BollMose

1
นี่หมายความว่ามีคำบรรยาย แต่ไม่ได้เขียนลงในวิดีโอใช่หรือไม่ ฉันสามารถแสดงได้ว่าต้องการตามความต้องการหรือไม่?
ดวงอาทิตย์

3
ใช่ @ sunk818 นั่นคือความหมาย สิ่งนี้จะเพิ่มคำบรรยายเป็นแทร็กที่สามารถเปิดหรือปิดได้ตราบเท่าที่เครื่องเล่นรองรับ คุณไฮด์และพอล ffmpeg ยังสามารถเพิ่มคำบรรยายด้านบนของวิดีโอได้และในกรณีนี้คุณจะควบคุมสิ่งต่างๆเช่นแบบอักษรและการวางตำแหน่ง
Boushley

1
ต้องนำเข้าไฟล์. srt โดย-c:s copyไม่ใช้-c:s mov_textไฟล์.
ฟรี

82

หมายเหตุ: โซลูชันนี้ "เบิร์นคำบรรยาย" ลงในวิดีโอเพื่อให้ผู้ดูวิดีโอทุกคนถูกบังคับให้ดู

ใช้libassไลบรารี (ตรวจสอบให้แน่ใจว่าการติดตั้ง ffmpeg ของคุณมีไลบรารีในการกำหนดค่า--enable-libass )

ก่อนอื่นให้แปลงคำบรรยายเป็น.assรูปแบบ:

ffmpeg -i subtitles.srt subtitles.ass

จากนั้นเพิ่มโดยใช้ตัวกรองวิดีโอ:

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

40
การดำเนินการนี้จะ "เบิร์นลงในวิดีโอ" ซึ่งหมายความว่าคุณไม่สามารถปิดได้ในโปรแกรมเล่น ซึ่งแตกต่างจากการเพิ่มเป็นสตรีมคำบรรยายซึ่งผู้เล่นสามารถอ่านและแสดงได้หากผู้ชมต้องการ
stib

1
ขอบคุณมากสำหรับการแก้ปัญหานี้ มีการระบุขนาดของตัวอักษรหรือไม่?
user1319182

1
ลองดูคำตอบนี้: stackoverflow.com/questions/21363334/… . คุณอาจต้องการตั้งค่าแบบอักษรในไฟล์คำบรรยายเองมิฉะนั้นเมื่อใช้ตัวกรองคำบรรยายคุณสามารถบังคับให้ตั้งค่าแบบอักษร: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8

สิ่งนี้จะมีประโยชน์เมื่อเพิ่มคำบรรยายสำหรับวิดีโอบางแห่งเช่น Instagram ที่ไหนสักแห่งเช่นโปรแกรมดูอินสตาแกรมที่ผู้ใช้ไม่มีความสามารถในการฟังเสียงหรือวิดีโอเป็นภาษาอื่นผู้ใช้สามารถอ่านคำบรรยายแทนได้
ϻαϻɾΣɀО-MaMrEzO

1
ติดตั้งlibassส่วนขยายหากไม่มีในระบบ Debian ด้วย apt update && apt install libass-dev "
Sopalajo de Arrierez

53

คุณกำลังพยายามใส่คำบรรยายเป็นสตรีมคำบรรยาย มันง่าย แต่ใช้ไวยากรณ์ที่แตกต่างกันสำหรับ MP4 (หรือ M4V) และ MKV ในทั้งสองกรณีคุณต้องระบุตัวแปลงสัญญาณวิดีโอและเสียงหรือเพียงแค่คัดลอกสตรีมหากคุณต้องการเพิ่มคำบรรยาย

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
สามารถเพิ่มคำบรรยายมากกว่าหนึ่งคำบรรยายได้หรือไม่? ซอฟต์ซับนี้จะถูกจำเป็นภาษาที่ไม่รู้จักหรือไม่?
Patrick

1
ใช่แล้ว. ฉันเพิ่งทดสอบ MKV:
dotokija

7
ขั้นแรกให้เพิ่มอินพุตอื่น: -i input2.srt ประการที่สองแมปที่เป็นสตรีมที่ 2: -map 2: 0 สุดท้ายเลือกตัวเข้ารหัสสำหรับสตรีมคำบรรยายที่ 2 (เช่นเดียวกับรายการแรก): -c: s srt ตัวอย่างที่สมบูรณ์ \ 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: a copy \ -c: s srt -c: s srt output.mkv
dotokija

8
และเพื่อเพิ่มข้อมูลเมตาของภาษา (แทรกก่อนไฟล์เอาต์พุต) "-metadata: s: s: 0 language = eng"
Patrick

ทำไมคำบรรยายในไฟล์ต้นฉบับจึงถูกแยกออกเมื่อฉัน "rewrap" ไฟล์ mkv เป็นไฟล์ mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? mkv ดั้งเดิมมีคำบรรยาย แต่เอาต์พุตในรูปแบบ mp4 ไม่มี เกิดอะไรขึ้น? ฉันทำอะไรไม่ถูกต้อง?
oldboy

9

MKV container รองรับตัวแปลงสัญญาณวิดีโอและเสียงแทบทุกอย่างและยังรองรับคำบรรยายและเมนูดีวีดี ดังนั้นคุณสามารถคัดลอกตัวแปลงสัญญาณจากวิดีโออินพุตไปยังวิดีโอเอาต์พุตด้วยคอนเทนเนอร์ MKV พร้อมคำบรรยาย ก่อนอื่นคุณควรแปลงรูปแบบคำบรรยาย SRT เป็น ASS

ffmpeg -i input.srt input.ass

และฝังคำบรรยาย ASS ลงในวิดีโอ

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

ยังทำงานกับไฟล์ 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

ดูหน้าวิกิการเปรียบเทียบรูปแบบคอนเทนเนอร์


1
HV ไม่เกี่ยวข้องจริงๆเรายินดีที่จะเห็นโซลูชันมากกว่าหนึ่งวิธี
JasonXA

8

ffmpeg รองรับmov_textตัวเข้ารหัสคำบรรยายซึ่งเกี่ยวกับตัวเข้ารหัสเดียวที่รองรับในคอนเทนเนอร์ MP4 และสามารถเล่นได้โดย iTunes, Quicktime, iOS เป็นต้น

บรรทัดของคุณจะอ่าน:

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


5

ฉันลองใช้ MP4Box สำหรับงานนี้ แต่มันไม่สามารถจัดการกับ M4V ที่ฉันจัดการได้ ฉันประสบความสำเร็จในการฝัง SRT เป็นคำบรรยายที่นุ่มนวลด้วย ffmpeg ด้วยบรรทัดคำสั่งต่อไปนี้:

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

เช่นเดียวกับคุณฉันต้องใช้ไฟล์เอาต์พุต MKV - ฉันไม่สามารถสร้างไฟล์ M4V ได้


3

ฉันจะให้คำตอบง่ายๆและทั่วไปที่ใช้ได้กับไฟล์เสียงและ คำบรรยายsrtและเคารพข้อมูลเมตาที่อาจรวมถึงคอนเทนเนอร์mkv ดังนั้นมันจะเพิ่มภาพที่ matroska อาจรวมเป็นไฟล์แนบ (แม้ว่าจะไม่ใช่ AFAIK ประเภทอื่น) และแปลงเป็นแทร็ก คุณจะไม่สามารถรับชมได้ แต่พวกเขาจะอยู่ที่นั่น (คุณสามารถ demux ได้) อ่าและถ้าmkvมีบทmp4ด้วย

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

อย่างที่คุณเห็นมันคือทั้งหมด-map 0ที่บอกให้FFmpegเพิ่มแทร็กทั้งหมดซึ่งรวมถึงข้อมูลเมตาบทไฟล์แนบและอื่น ๆ หากมี "แทร็ก" ที่ไม่รู้จัก ( mkvอนุญาตให้แนบไฟล์ประเภทใดก็ได้ ) มันจะ จบลงด้วยข้อผิดพลาด

คุณสามารถสร้างชุดที่เรียบง่ายmkv2mp4.batถ้าคุณมักจะทำเช่นนี้เพื่อสร้างmp4ที่มีชื่อเดียวกับMKV มันจะดีกว่าถ้ามีการควบคุมข้อผิดพลาดชื่อเอาต์พุตอื่น ฯลฯ แต่คุณจะเข้าใจตรงกัน

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

ตอนนี้คุณสามารถเรียกใช้

mkv2mp4 "Video with subtitles etc.mkv"

และจะสร้าง "วิดีโอพร้อมคำบรรยาย ฯลฯ mp4" โดยมีข้อมูลสูงสุดรวมอยู่ด้วย


-1

ตัวอย่างง่ายๆ:

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

แทนที่ตัวแปร linux เท่านั้น


สนใจที่จะทำอย่างละเอียด?
RamenChef

-3

นี่คือเหตุผลว่าทำไม mkv จึงเป็นคอนเทนเนอร์ที่ดีโดยเฉพาะตอนนี้ที่โตเต็มที่:

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

3
สนใจที่จะแสดงความคิดเห็นว่าเหตุใดแนวทางของคุณจึงสามารถแก้ไขปัญหาของ OP ได้?
mjuarez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.