Sử dụng ffmpeg để tách mkv nhưng bị mất vài giây video (cắt giữa các khung hình chính mà không mã hóa lại?)


5

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 mkvmergevớ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.


Vui lòng bao gồm ffmpegđầu ra giao diện điều khiển hoàn chỉnh .
llogan

@LordNeckbeard Đã thêm.
Zhuoyun Wei

Khi bạn sao chép các luồng, ffmpeg chỉ có thể sao chép tại các khung hình chính, nghĩa là bạn sẽ không luôn luôn (hoặc, trong hầu hết các trường hợp) được cắt theo dấu thời gian chính xác mà bạn muốn. Liệu thiết lập -async 1như là một tùy chọn làm việc?
slhck

@slhck Có vẻ như có gì đó để làm với khung hình chính. Tôi đã thử "-async 1" nhưng kết quả vẫn như nhau. Có phải thực tế là ffmpeg chỉ có thể sao chép tại các khung hình chính có nghĩa là nó không thể cắt mkv chính xác như mkvmerge làm?
Zhuoyun Wei

mkvmerge cũng có thể chia video ở các khung chính.
Calmarius

Câu trả lời:


0

Để cắt giữa các khung hình chính (hoặc GOP, như chúng được gọi), bạn cần mã hóa lại video. (điều tương tự cũng đúng với âm thanh, nhưng ở đó "khung" nhỏ hơn nhiều, thường là 1024 mẫu).

Trong trường hợp của bạn, bạn có thể thay đổi -codec copyđể -acodec copy -vcodec webmffmpeg mã hóa lại luồng của bạn. Điều này rõ ràng sẽ mất nhiều thời gian hơn và bạn sẽ mất chất lượng (nếu bạn làm đúng, sự mất mát này sẽ không đáng chú ý, nhưng sẽ có một số).


Cảm ơn. Tôi biết mã hóa lại sẽ giải quyết vấn đề này. Nhưng vì mkvmerge có thể phân chia chính xác cùng một video mà không cần mã hóa lại, tôi nghĩ liệu có cách nào để ffmpeg thực hiện công việc tương tự không.
Zhuoyun Wei
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.