Để hoạt động chính xác, trước tiên hãy chuyển đổi video thành dòng bit RAW YUV (nếu chưa có) bằng cách:
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Bước tiếp theo: Bộ select
lọc lấy một biểu thức , trong đó n
là số khung.
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
Để ffmpeg
không trùng lặp các khung, bạn phải buộc một nửa tốc độ khung hình của đầu vào - vì vậy bạn đặt "2" làm đầu vào và "1" cho đầu ra. Đừng quên thay thế WxH bằng kích thước thực của clip của bạn vì dòng bit thô không có tiêu đề mang thông tin này.
Thay vì ở trên, một khả năng khác là thêm setpts
bộ lọc để đặt dấu thời gian mới cho đầu ra. Nhưng hãy cẩn thận vì nó giảm khung hình không chính xác. Ở đây, 25 là tốc độ khung hình đầu ra thực tế bạn muốn:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
Tất nhiên bạn có thể chọn định dạng pixel khác (bất kỳ ffmpeg -pix_fmts
). Đảm bảo rằng khi đọc tệp bạn biết kích thước pixel và định dạng pixel:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …