Tôi đang sử dụng ffmpeg (bản thật từ FFmpeg, không phải bản giả từ Libav) để phân tách một số tệp mkv:
ffmpeg -i input.mkv -ss 00:01:00 -to 00:02:00 -codec copy output.mkv
Tuy nhiên, khi tôi mở output.mkv bằng VLC, vài giây đầu tiên không có video mà chỉ có âm thanh. Và vài giây sau tôi có thể thấy cả video và âm thanh. Phần thú vị là, khi tôi thử các dấu thời gian khác nhau sau tham số -ss, thời lượng của phần "chỉ âm thanh" thay đổi từ 1 giây đến 4 giây hoặc thậm chí nhiều hơn.
Tôi cố gắng để sử dụng mkvmerge
với --split "timecodes:00:01:00,00:02:00"
, và các tập tin đầu ra hoạt động tốt, không có "chỉ có âm thanh" phần lúc đầu.
Tôi đã thử các thùng chứa mkv khác nhau với mã hóa video / âm thanh khác nhau, nhưng kết quả đều giống nhau.
Tôi nghĩ rằng tôi đang thiếu một số tùy chọn với ffmpeg. Tôi nên thêm gì vào dòng lệnh ffmpeg để tránh vài giây của phần "chỉ âm thanh"?
Cập nhật 1
Đây là đầu ra hoàn chỉnh:
$ ffmpeg -i 21.mkv -ss 00:00:58 -to 00:02:00 -codec sao chép clip.mkv ffmpeg phiên bản 2.2.2 Bản quyền (c) 2000-2014 các nhà phát triển FFmpeg được xây dựng vào ngày 7 tháng 5 năm 2014 13:08:45 với gcc 4.8.2 (GCC) 20140206 (phát hành trước) cấu hình: --prefix = / usr --disable-gỡ lỗi cho phép-libbluray - enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 enable-pic --enable-postproc --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab libavutil 52. 66.100 / 52. 66.100 libavcodec 55. 52.102 / 55. 52.102 libavformat 55. 33.100 / 55. 33.100 libavdevice 55. 10.100 / 55. 10.100 libavfilter 4. 2.100 / 4. 2.100 libavresample 1. 2. 0 / 1. 2. 0 libswscale 2. 5.102 / 2. 5.102 libswresample 0. 18.100 / 0. 18.100 libpostproc 52. 3.100 / 52. 3.100 Đầu vào số 0, matroska, webm, từ '21 .mkv ': Metadata: bộ mã hóa: libebml v1.3.0 + libmatroska v1.4.0 Creation_time: 2014-05-07 01:47:41 Thời lượng: 00: 42: 50,78, bắt đầu: 0,000000, bitrate: 2833 kb / s Luồng # 0: 0 (Anh): Video: h264 (Cao), yuv420p (tv, bt709), 1280x720, SAR 1: 1 DAR 16: 9, 23,98 khung hình / giây, 23,98 tbr, 1k tbn, 47,95 tbc (mặc định) Luồng # 0: 1: Âm thanh: ac3, 48000 Hz, 5.1 (bên), fltp, 384 kb / s (mặc định) Đầu ra # 0, matroska, thành 'clip.mkv': Metadata: bộ mã hóa: Lavf55.33.100 Luồng # 0: 0 (eng): Video: h264 (H264 / 0x34363248), yuv420p, 1280x720 [SAR 1: 1 DAR 16: 9], q = 2-31, 23,98 fps, 1k tbn, 1k tbc (mặc định) Luồng # 0: 1: Âm thanh: ac3 ([0] [0] [0] / 0x2000), 48000 Hz, 5.1 (bên), 384 kb / s (mặc định) Ánh xạ dòng: Luồng # 0: 0 -> # 0: 0 (sao chép) Luồng # 0: 1 -> # 0: 1 (bản sao) Nhấn [q] để dừng, [?] Để được trợ giúp khung = 1414 khung hình / giây = 0,0 q = -1,0 Lsize = 18275kB thời gian = 00: 01: 02.00 bitrate = 2414.6kbits / s video: 15344kB âm thanh: 2906kB phụ đề: 0 dữ liệu: 0 tiêu đề toàn cầu: 0kB muxing trên không 0,134916%
Cập nhật 2
Có thể có một cái gì đó để làm với công cụ "keyframe" và để ffmpeg mã hóa lại luồng video sẽ không dẫn đến vài giây video trống. Tuy nhiên, vì mkvmerge có thể cắt cùng một tệp giữa các khung hình chính mà không cần mã hóa lại, tôi tự hỏi liệu có cách nào để ffmpeg thực hiện công việc tương tự không. Ví dụ: phần nào "định nghĩa lại" khung hình chính, et cetra.
-async 1
như là một tùy chọn làm việc?
ffmpeg
đầu ra giao diện điều khiển hoàn chỉnh .