Để 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ộ selectlọc lấy một biểu thức , trong đó nlà 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
Để ffmpegkhô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 setptsbộ 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 …