Clip trích xuất FFmpeg - tốc độ khung hình luồng khác với tốc độ khung hình container (x264, aac)


8

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 -ttù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 -ttù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).


Mã hóa lại không phải là một giải pháp và thực hiện giải mã một giờ trong vài phút nội dung là không hợp lý và có khả năng sẽ không giải quyết được vấn đề tiềm ẩn. Nghiên cứu ban đầu tuyệt vời btw. Bạn có thể đúng khi cho rằng ffmpeg fps đang phát hiện là gốc rễ của vấn đề của bạn. Nghe có vẻ như một phiên bản mới hơn của ffmpeg đã khắc phục vấn đề của bạn nhưng tôi sẽ đưa ra nhận xét. Tôi đã đề nghị thực hiện một bản sao -c sang một định dạng chứa khác. Điều này có thể có nhiều hiệu ứng khác nhau nhưng đây sẽ là một bước tiếp theo tốt để thử nghiệm.
dstob

Câu trả lời:


1

Với ffmpeg, việc định vị các tùy chọn quan trọng. Với ví dụ của bạn, nó đang cố gắng áp dụng -ss và -t cho đầu vào. Sử dụng nó như thế này sẽ áp dụng các tùy chọn cho đầu ra thay thế:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

Với ffmpeg hiện tại, cú pháp đúng sẽ là:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

Tôi đã có cùng một vấn đề và giải pháp của tôi là như sau:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec ('ffmpeg -y -i /testmedia/'.$info['filename']. '-vf fps = fps = 1 /'.$ fracduration.' -f image2 /testmedia/images/output%03d.jpg 2 > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

Điều này mang lại cho tôi 10 hình ảnh cho tất cả video cho dù độ dài của video

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.