Ít nhất là trên FFmpeg 2.8.x (nhưng oldie cũng hoạt động), bạn có thể sử dụng lavfi
làm định dạng đầu vào và biểu đồ bộ lọc phức tạp bằng cách sử dụng movie
và setpts
bộ lọc làm đối số cho -i
tùy chọn.
Lệnh tiếp theo thực hiện công việc này cho bạn:
ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4
Không loop=
đối số có nghĩa là vòng lặp vô cực. Giá trị lớn hơn không đặt số lần lặp lại. setpts
các bộ lọc cần thiết để điều chỉnh PTS cho các lần lặp lại thứ hai và sau đó, nếu không, hầu hết các bộ chuyển đổi đầu ra sẽ thất bại với việc tăng PTS không đơn điệu: vòng lặp không tính lại PTS.
Lưu ý rằng việc sử dụng các bộ lọc giả định rằng bỏ qua các khung mà không giải mã / mã hóa là không thể: bởi các bộ lọc thiết kế chỉ xử lý các khung được giải mã.
Tại FFmpeg 2.8.2 tùy chọn đầu vào mới được đưa vào -stream_loop
. Trước tiên tôi thấy nó hoạt động đơn giản hơn và cho phép sao chép nội dung mà không cần chuyển mã:
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4
Nhưng nó không tính toán lại PTS và tập tin đầu ra là sai. Nếu bạn thêm bộ lọc để sửa PTS (xem setpts
), bạn cũng phải xóa -c copy
. Chỉ các bộ lọc dòng bit mới có thể xử lý các gói được mã hóa, nhưng không có bất kỳ bộ lọc dòng bit nào để sửa PTS (xem: https://ffmpeg.org/ffmpeg-bitstream-filters.html )
Trong mọi trường hợp, ffmpeg trên pass thứ hai không thành công với lỗi:
input.mp4: Resource temporarily unavailable
Công việc đã biết đối với tôi : sử dụng bộ chứa cho tệp đầu vào không có giới hạn PTS (bộ chứa phát trực tuyến). Một trong số họ, được biết đến với tôi, là MPEG-TS. Vì vậy, bạn có thể đơn giản chuyển đổi tệp MP4 của mình sang MPEG-TS:
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts
Và sử dụng lệnh tiếp theo để soạn tập tin vô cực:
ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4
(chỉ nên sử dụng bộ lọc dòng bit nếu cần, trên các mẫu của tôi là bắt buộc)
FFmpeg> = 2.8.2 là bắt buộc trong trường hợp này.