cắt chính xác video (+ âm thanh) với ffmpeg


10

Tôi muốn trang web của mình cho phép người dùng tạo chính xác các clip của họ từ một video nguồn tôi cung cấp.

Tôi có một tệp video nguồn mà trước tiên tôi muốn chuyển đổi thành một cái gì đó phù hợp cho một trang web:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Tôi sử dụng ffmpeg để chuyển đổi nó như vậy:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Xem lại video này có chất lượng đủ tốt và kích thước tệp đủ nhỏ cho nhu cầu của tôi và tải / phát trên trang web của tôi.

Tôi có một trang web cho phép người dùng chọn điểm bắt đầu và điểm cuối trên video này - và tạo clip. Đây là một ví dụ về lệnh ffmpeg mà tôi sử dụng cho điều đó:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

Vấn đề là clip không phải lúc nào cũng đủ chính xác. Thông thường âm thanh đủ chính xác nhưng video dừng sớm nửa giây hoặc một cái gì đó.

Có cách nào để làm cho điều này chính xác và không đồng bộ để nói, 0,2 giây không?

EDIT: Thêm -force_key_frames 00:00:00.2không giúp đỡ.

EDIT: Tôi đã thay đổi việc cắt để sử dụng -c:v libx264 -c:a aac -strict experimentalthay vì -codec:v copy -codec:a copyvới kết quả tốt (ish).

Tệp có thể phát bên ngoài mà không gặp sự cố - nhưng khi tôi tải nó vào phần tử video html5 của mình và phát nó - phần cuối của video (âm thanh vẫn ổn) bị đóng băng. Phần cuối cùng đóng băng dài chưa đến một giây.

Tôi có nên thử nó với một bộ mã hóa video khác không? Sự thay thế tốt nhất cho libx264 là gì? Ghi nhớ có lẽ tôi sẽ muốn nó ở trên một trang web công cộng.

Tuy nhiên, vấn đề không phải là nó phát chính xác mà không gặp sự cố với trình phát như MPC hoặc Windows Media Player cho thấy đó có phải là sự cố với Google Chrome hoặc thành phần video HTML không? Hay tôi đang sử dụng một mã hóa không được hỗ trợ hay cái gì đó?


Điều này có thể phải làm với thời gian của các khung chính. Trong mọi trường hợp, điều này nên được chuyển đến SuperUser.com.
Brad

Xin chào, ffmpeg không thể cắt video tại bất kỳ điểm nào, nó chỉ có thể cắt trên khung hình chính; vì lý do này, âm thanh gần như chính xác, trong khi video thì không.

Tôi có thể tự di chuyển nó không? Tôi sẽ thử thêm các khung chính vào tệp nguồn bằng -force_key_frames 00: 00: 00.2
Pete Oakey

Câu trả lời:


9

Hành vi của các -ssthay đổi tùy thuộc vào việc nó được sử dụng làm tùy chọn đầu vào hoặc đầu ra, và thường chậm hơn nhưng có thể chính xác hơn khi được sử dụng làm tùy chọn đầu ra. Xem câu trả lời để ffmpeg chuyển đổi video từ khoảng thời gian được chỉ định từ từ để biết thêm chi tiết và ví dụ.

Để thay đổi chất lượng đầu ra, hãy source.mp4sử dụng -crftùy chọn có giá trị từ 18-28 (23 là mặc định). Xem phần CRF của Hướng dẫn mã hóa FFmpeg và x264 để biết ví dụ.

Lệnh cắt tỉa của bạn có thể được đơn giản hóa:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Tôi thay thế -codec:v copy -codec:a copybằng -c copy -map 0. Điều này sẽ sao chép tất cả các luồng thay vì chỉ các luồng video và âm thanh đầu tiên - mặc dù đầu vào chỉ có hai luồng do lệnh trước đó của bạn. Vì bạn không thể mở rộng quy mô mà không mã hóa lại, do đó loại trừ lẫn nhau -codec:v copyvà do đầu vào của bạn đã được thu nhỏ theo kích thước đã đặt nên tôi đã xóa các tùy chọn bộ lọc.

Nếu vẫn chưa đủ chính xác thì hãy thử:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Nó sẽ chậm hơn, nhưng có lẽ chính xác hơn. Xem các liên kết trong câu trả lời trong liên kết đầu tiên tôi cung cấp để mô tả về sự khác biệt của hai ví dụ này.

Cuối cùng, bạn nên chạy source.mp4qua qt-faststart(nằm trong thư mục công cụ trong nguồn ffmpeg) hoặc sử dụng -movflags faststarttùy chọn. Điều này sẽ di chuyển một số dữ liệu vào đầu tập tin để nó có thể bắt đầu phát lại trước khi nó được tải xuống hoàn toàn.


+1 cho các mẹo nhưng tôi đã thử ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c sao chép -map 0 clip1.mp4 nhưng phần đầu tiên (gần một giây) và phần cuối (có thể là một phần tư giây) của video bị bỏ lỡ, âm thanh là tốt mặc dù.
Pete Oakey

@PeteOakey Bạn đã thử cắt mà không cần sao chép bit, nhưng mã hóa lại thực tế?
slhck

Đã thử nó mà không cần sao chép bit - kết quả được nối với câu hỏi của tôi.
Pete Oakey

3
Sử dụng -sstùy chọn đầu ra thay vì tùy chọn đầu vào đã khắc phục vấn đề của tôi: khung hình video đầu tiên là khoảng 1 giây trong video đầu ra, chỉ có âm thanh trước đó (cũng được xác nhận bởi ffprobe -show_frames). Di chuyển -sssau khi -ilàm cho nó xuất ra các khung âm thanh và video bắt đầu từ khung 0.
CodeManX
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.