Buộc thời lượng video đầu ra với phụ đề bên ngoài trong ffmpeg


1

Tôi đang trích xuất một đoạn dài 1 phút của tệp video bắt đầu từ 30 phút kể từ đầu và thêm phụ đề từ tệp bên ngoài bằng lệnh sau:

ffmpeg -ss 1800 -i input_video.m4v -ss 1800 -i input_subtitle.srt -map 1:0 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 -avoid_negative_ts 1 output_video.mp4

Vấn đề tôi nhận được là video chuyển mã có thời lượng 00:01:03.50 thay vì mong đợi 00:01:00.00. Và khi phát video như vậy với VLC, quá trình phát lại dừng trước khi thanh tiến trình kết thúc.

Thời lượng chỉ trở thành chính xác 1 phút nếu tôi xóa đầu vào phụ đề. Có vẻ như thời lượng của tệp đầu ra được mở rộng để phù hợp với cụm từ cuối cùng từ phụ đề bắt đầu trong phạm vi 1 phút đã xác định.

Có cách nào để buộc thời lượng đầu ra chính xác với giá trị được đặt trong -d cờ?


Làm phụ đề phải mềm?
Gyan

Vâng. Họ phải được chuyển đổi.
BartoNaz

Câu trả lời:


1

Do cách ffmpeg phân tích tệp phụ đề, có hai tùy chọn có sẵn cho bạn:

Xuất ra MP4, nhưng có thể bỏ qua phụ đề :

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 output_video.mp4

Điều này sẽ tạo ra một tệp 60 giây nhưng nó sẽ bỏ qua mọi phụ đề bắt đầu trước 1800 nhưng kéo dài qua nó.

Đầu ra cho MKV :

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s ass -crf 35 -preset slow -t 60 output_video.mkv

Ở đây, bất kỳ phụ đề nào bắt đầu trước những năm 1800 và kéo dài qua nó sẽ có mặt và có độ dài tương xứng, tức là nếu một phụ bắt đầu từ 1795 và kết thúc ở 1802, thì nó sẽ tồn tại trong 2 giây ở đầu ra.

Phương pháp 2 bước

ffmpeg -i subfile -ss 1800 -t 60 sub.ass

ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4

Điều này trích xuất phần phụ tương ứng với phân đoạn video mong muốn và sau đó được nối với video.


Cám ơn vì sự gợi ý. Trong ví dụ trước, phụ đề sẽ không tồn tại trong 5 giây nếu nó bị cắt bớt?
BartoNaz

Nhưng cả hai giải pháp này đều có một vấn đề lớn mà họ có -ss gắn cờ trước tệp đầu ra, sẽ kích hoạt tìm kiếm chậm mà không sử dụng khung hình chính. Vì vậy, sẽ mất rất lâu để giải mã 30 phút video đầu tiên trước khi đến phần thú vị. Xem thêm về điều này ở đây: trac.ffmpeg.org/wiki/Seeking
BartoNaz

1
Tôi nhận thức rõ về việc tìm kiếm chậm. Nhưng nếu bạn muốn bộ giải mã phụ không bao gồm phụ trước đó và ghi thời gian tương đối chính xác cho phụ được bao gồm, thì nó phải được tìm kiếm chậm, vì không giống như các luồng âm thanh / video, phụ đề không được đóng gói và có mặt dưới dạng khung 1 " ". Tìm kiếm nhanh hoạt động ở cấp độ demuxer và dựa vào chỉ mục vùng chứa để bỏ qua phần bù byte của khung hình chính trước gần nhất. Nhưng chỉ có 1 khung cho phụ đề.
Gyan

1
Nếu chi phí thời gian quá cao, bạn có thể làm điều này theo hai bước. Sử dụng ffmpeg -i subfile -ss 1800 -t 60 sub.ass và sau đó ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4
Gyan

Cảm ơn rất nhiều. Điều này làm rõ nó rất nhiều. Xin vui lòng, cập nhật câu trả lời với giải pháp 2 bước này và tôi có thể chấp nhận nó.
BartoNaz
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.