Sử dụng ffmpeg để thêm phụ đề văn bản [đã đóng]


120

Tôi đang cố gắng thêm phụ đề văn bản vào vùng chứa .mp4 bằng ffmpeg:

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

Khi tôi đang cố chạy dòng này, nó sẽ báo lỗi:

Nmber của bản đồ luồng phải khớp với số lượng luồng đầu ra.

Nếu tôi cố gắng thay đổi mp4 thành mkv (mặc dù mp4 hỗ trợ phụ đề văn bản), như thế này:

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

Nó ánh xạ chính xác các luồng, nhưng đưa ra một lỗi:

Không tìm thấy bộ mã hóa (id id 94210) cho luồng đầu ra # 0.2

Khi tôi khởi chạy

ffmpeg -codecs

Tôi có thể thấy rằng codec srt được hỗ trợ như bộ giải mã và bộ mã hóa, tuy nhiên tôi không chắc những gì được sử dụng cho mã hóa phụ mp4 và mkv, và liệu tôi có cần bật hoặc biên dịch riêng không.

Câu trả lời:


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

-vf subtitles=infile.srt sẽ không làm việc với -c copy


Thứ tự của -c copy -c:s mov_textlà quan trọng. Bạn đang nói với FFmpeg:

  1. Video: sao chép, Âm thanh: sao chép, Phụ đề: sao chép
  2. Phụ đề: Mov bản

Nếu bạn đảo ngược chúng, bạn đang nói với FFmpeg:

  1. Phụ đề: Mov bản
  2. Video: sao chép, Âm thanh: sao chép, Phụ đề: sao chép

Ngoài ra, bạn có thể chỉ cần sử dụng -c:v copy -c:a copy -c:s mov_texttheo thứ tự bất kỳ.


13
Phương pháp này thêm phụ đề vào tệp dưới dạng một luồng, vì vậy cần hỗ trợ người chơi để hiển thị phụ đề (chẳng hạn như VLC)
BollMose

1
Điều này có nghĩa là phụ đề có sẵn, nhưng không được ghi vào video? Tôi có thể hiển thị nếu tôi muốn theo yêu cầu?
CN

3
Có @ sunk818 đó là những gì có nghĩa là. Điều này thêm phụ đề dưới dạng một bản nhạc có thể được bật hoặc tắt miễn là người chơi hỗ trợ nó. Ông Hyde và Paul ffmpeg cũng có thể thêm phụ đề của chính video và trong những trường hợp đó, bạn sẽ kiểm soát những thứ như phông chữ và định vị.
Boushley

1
Các tập tin .srt phải được nhập mà -c:s copykhông có -c:s mov_text.
GetFree

80

LƯU Ý: Giải pháp này "ghi phụ đề" vào video để mọi người xem video sẽ bị buộc phải xem chúng.

Sử dụng libassthư viện (đảm bảo cài đặt ffmpeg của bạn có thư viện trong cấu hình --enable-libass).

Đầu tiên chuyển đổi phụ đề sang .assđịnh dạng:

ffmpeg -i subtitles.srt subtitles.ass

Sau đó thêm chúng bằng bộ lọc video:

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

39
Điều này sẽ "ghi chúng vào" video, nghĩa là bạn không thể tắt chúng trong trình phát. Điều này khác với việc thêm chúng dưới dạng luồng phụ đề mà người chơi có thể đọc và hiển thị nếu người xem muốn chúng.
stib

1
Cảm ơn rất nhiều cho giải pháp này. Có cách nào để xác định kích thước của các ký tự?
user1319182

1
Hãy xem câu trả lời này: stackoverflow.com/questions/21363334/ . Có thể bạn sẽ muốn tự đặt phông chữ trong tệp phụ đề, nếu không, bằng cách sử dụng bộ lọc phụ đề, bạn có thể buộc_style để đặt Phông chữ: ffmpeg.org/ffmpeg-filters.html#subtitle-1
HdN8

Điều này sẽ hữu ích khi thêm phụ đề cho video ở đâu đó như Instagram. Ở đâu đó như người xem Instagram mà người dùng không có khả năng nghe âm thanh hoặc video bằng ngôn ngữ khác, sau đó người dùng có thể đọc phụ đề thay vào đó
ϻαϻ602-MaMrEzO

1
Cài đặt libasstiện ích mở rộng nếu thiếu trên các hệ thống Debian với `apt update && apt install libass-dev".
Sopalajo de Arrierez

53

Bạn đang cố gắng chuyển phụ đề thành luồng phụ đề. Nó dễ dàng nhưng cú pháp khác nhau được sử dụng cho MP4 (hoặc M4V) và MKV. Trong cả hai trường hợp, bạn phải chỉ định codec video và âm thanh hoặc chỉ sao chép luồng nếu bạn chỉ muốn thêm phụ đề.

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
Có thể thêm nhiều phụ đề không? Softtsub này sẽ được công nhận là ngôn ngữ chưa biết?
Patrick

1
Vâng, đúng vậy. Tôi vừa thử nó cho MKV:
dotokija

7
Đầu tiên thêm một đầu vào khác: -i input2.srt. Thứ hai, ánh xạ như luồng thứ 2: -map 2: 0. Cuối cùng, chọn bộ mã hóa cho luồng phụ đề thứ 2 (giống như dòng đầu tiên): -c: s srt. Ví dụ đầy đủ \ 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: một bản sao \ -c: s srt -c: s srt
output.mkv

8
Và để thêm siêu dữ liệu ngôn ngữ (chèn trước tệp đầu ra) "-metadata: s: s: 0 ngôn ngữ = eng"
Patrick

Làm thế nào mà phụ đề trong tệp gốc bị loại trừ khi tôi "viết lại" các tệp mkv dưới dạng tệp mp4 (ffmpeg -i film.mkv -vcodec sao chép -acodec sao chép phim.mp4) ?? mkv gốc có phụ đề nhưng đầu ra ở định dạng mp4 thì không. chuyện gì đang xảy ra vậy những gì tôi đang làm không chính xác?
oldboy

9

MKV container hỗ trợ codec video và âm thanh Hầu như mọi thứ và cũng hỗ trợ phụ đề và menu DVD. Vì vậy, bạn chỉ có thể sao chép codec từ video đầu vào sang video đầu ra với bộ chứa MKV có phụ đề. Trước tiên, bạn nên chuyển đổi định dạng phụ đề SRT sang ASS

ffmpeg -i input.srt input.ass

và nhúng phụ đề ASS vào 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

Cũng làm việc với tập tin 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

xem trang wiki So sánh các định dạng container


1
HV không thực sự phù hợp, luôn luôn hoan nghênh thấy nhiều giải pháp hơn một.
JasonXA

8

ffmpeg hỗ trợ mov_textbộ mã hóa phụ đề, là bộ duy nhất được hỗ trợ trong bộ chứa MP4 và có thể phát bởi iTunes, Quicktime, iOS, v.v.

Dòng của bạn sẽ đọc:

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


5

Tôi đã thử sử dụng MP4Box cho nhiệm vụ này, nhưng nó không thể xử lý M4V mà tôi đang xử lý. Tôi đã thành công khi nhúng SRT dưới dạng phụ đề mềm với ffmpeg với dòng lệnh sau:

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

Giống như bạn, tôi phải sử dụng tệp đầu ra MKV - Tôi không thể tạo tệp M4V.


3

Tôi sẽ cung cấp một câu trả lời đơn giản và chung chung, hoạt động với bất kỳ số lượng phụ đề âm thanh và srt nào tôn trọng siêu dữ liệu có thể bao gồm bộ chứa mkv . Vì vậy, nó thậm chí sẽ thêm hình ảnh mà matroska có thể bao gồm dưới dạng tệp đính kèm (mặc dù không phải là loại AFAIK khác) và chuyển đổi chúng thành bản nhạc; bạn sẽ không thể xem nhưng họ sẽ ở đó (bạn có thể giải thích chúng). Ah, và nếu mkv có chương mp4 thì quá.

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

Như bạn có thể thấy, đó là tất cả về -map 0, yêu cầu FFmpeg thêm tất cả các bản nhạc, bao gồm siêu dữ liệu, chương, tệp đính kèm, v.v. Nếu có một "bản nhạc" không được nhận dạng ( mkv cho phép đính kèm bất kỳ loại tệp nào), nó sẽ kết thúc với một lỗi.

Bạn có thể tạo một lô đơn giản mkv2mp4.bat, nếu bạn thường làm điều này, để tạo một mp4 có cùng tên với mkv . Sẽ tốt hơn với kiểm soát lỗi, một tên đầu ra khác, v.v., nhưng bạn có được điểm.

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

Bây giờ bạn có thể chỉ cần chạy

mkv2mp4 "Video with subtitles etc.mkv"

Và nó sẽ tạo ra "Video có phụ đề, vvmp4" với tối đa thông tin được bao gồm.


-1

Ví dụ đơn giản:

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

Chỉ thay thế các biến linux


Quan tâm đến công phu?
RamenChef

-3

Đây là lý do tại sao mkv là một container tốt như vậy, đặc biệt là bây giờ nó đã trưởng thành:

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

3
Muốn bình luận về lý do tại sao cách tiếp cận của bạn sẽ khắc phục vấn đề của OP?
mjuarez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.