Tóm tắt
video H.264 dường như có tốc độ khung hình thực sự cao đòi hỏi hệ số tỷ lệ áp dụng cho thời lượng của video mà tôi đang cố trích xuất (thấp hơn 900 lần).
Cơ thể
tôi đang cố trích xuất một đoạn phim từ một bộ phim mà tôi có ở định dạng MP4 (được tạo bằng Handbrake ). Sau khi thử mencoder và VLC, tôi quyết định cho FFmpeg một shot vì nó ít rắc rối nhất khi sao chép codec. Đó là, so với mencoder và VLC, tệp kết quả vẫn có thể phát được trong QuickTime (Tôi biết về Perian, v.v., tôi chỉ đang cố gắng tìm hiểu cách thức hoạt động của tất cả những thứ này).
Dù sao, lệnh của tôi là như sau:
ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
Trong quá trình sao chép, phần sau đây xuất hiện:
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size= 8144kB time=101.60 bitrate= 656.7kbits/s
…
Thay vì clip có thời lượng 5:59, tôi lấy toàn bộ phần còn lại của bộ phim. Vì vậy, để kiểm tra điều này, tôi đã chạy lệnh ffmpeg với -t 00:00:01
. Những gì tôi nhận được chính xác là một clip 15:00 phút. Vì vậy, tôi đã thực hiện một số kỹ thuật hộp đen và quyết định mở rộng -t
tùy chọn của mình bằng cách tính giá trị nào cần nhập trong 1 giây được hiểu là 900 giây. Đối với clip 359 giây mong muốn của tôi, tôi đã tính 0,399 giây và do đó lệnh ffmpeg của tôi đã trở thành:
ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
Điều này hoạt động, nhưng tôi không biết tại sao thời lượng được thu nhỏ bằng 900. Điều tra thêm, mỗi lần chạy ffmpeg có dòng:
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
45000/25 = 1800. Phải là mối quan hệ ở đâu đó. Bằng cách nào đó, tốc độ khung hình cao khó hiểu đang gây ra vấn đề với thời gian. Làm thế nào là tốc độ khung hình rất cao? Phần tốt nhất về điều này là clip.mp4 kết quả có tính năng chính xác tương tự (do codec video được sao chép) và việc lấy thêm các clip từ điều này cần có cùng tỷ lệ cho -t
tùy chọn thời lượng. Do đó, tôi đã cung cấp nó cho bất kỳ ai sẵn sàng kiểm tra điều này.
Phụ lục
Phần mở đầu cho ffmpeg trên hệ thống của tôi (được xây dựng bằng cổng ffmpeg của MacPorts):
FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 0
libavformat 52.31. 0 / 52.31. 0
libavdevice 52. 1. 0 / 52. 1. 0
libavfilter 1. 4. 0 / 1. 4. 0
libswscale 1. 7. 1 / 1. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Jan 4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)
EDIT
Không chắc đó có phải là lỗi hay không, nhưng dường như nó đã được sửa trong phiên bản ffmpeg hiện tại của tôi, ít nhất là cho video này (phiên bản 0.6.1 từ MacPorts).