Sử dụng trim
và concat
- các tệp nguồn với các codec khác nhau
Đối với điều này, hãy đảm bảo rằng các tệp riêng lẻ của bạn có cùng độ phân giải, và lý tưởng là cùng một mẫu phụ khung và sắc độ, v.v ... Điều này sẽ ngăn ngừa lỗi hoặc trục trặc trong quá trình ghép.
Bạn có thể thực hiện mọi thứ trong một lần mà không cần tách tệp, sử dụng trim
và concat
bộ lọc:
ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4
Ở đây, trim
được sử dụng để chỉ định các phần riêng lẻ của các luồng video đầu vào ( 0:v
, 1:v
) mà sau này bạn muốn nối. Những phần này được đặt tên v0
thông qua v2
. (Bộ setpts
lọc đặt lại dấu thời gian của các phần riêng lẻ này thành 0, được yêu cầu để ghép). Sau đó, chúng tôi nối ba phần.
Nếu bạn muốn cắt từ một dấu thời gian nhất định đến hết, hãy sử dụng trim=start=15
thay vì chỉ định phạm vi.
Nếu tệp của bạn có âm thanh, bạn phải cắt riêng các luồng đó:
ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
Lưu ý rằng video và âm thanh sẽ được mã hóa lại trong trường hợp này - đảm bảo chỉ định các mục tiêu chất lượng đầu ra phù hợp (ví dụ: -crf
x264, x265 hoặc libvpx-vp9). Bạn có thể đọc thêm về điều này trên FFmpeg Wiki, ví dụ cho VP9 hoặc H.264 .
Sử dụng các phân đoạn riêng lẻ
Nếu bạn muốn tách các clip và sau đó lắp lại chúng:
ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4
Nếu các tệp có âm thanh, sử dụng cách tiếp cận tương tự như trên:
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4
Điều này sẽ một lần nữa mã hóa lại luồng video. Nó đơn giản hơn một chút nhưng nếu không thì tương đương với phương pháp trên.
Sử dụng concat
demuxer
Về nguyên tắc, bạn cũng có thể cố gắng nối các dòng bit mà không cần mã hóa lại chúng, bằng cách sử dụng bộ giải mã concat. Tạo một tệp được gọi concat.txt
và thêm các mục sau (tương ứng với các video clip được tạo ở trên):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
Sau đó nối các tệp riêng lẻ này:
ffmpeg -f concat -i concat.txt -c copy output.avi
Tuy nhiên, điều này đòi hỏi các clip của bạn phải có cùng codec, độ phân giải, tốc độ khung hình, v.v. - vì vậy nó không hoạt động với tất cả các loại nguồn không đồng nhất.
Sử dụng concat
giao thức
Loại kết hợp cấp độ tệp ở trên cũng có thể đạt được bằng cách sử dụng concat
giao thức, với cùng một loại ràng buộc như trên (cùng codec, độ phân giải, v.v.):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
Để biết thêm thông tin về ghép nối, hãy đọc trang Wiki FFmpeg tương ứng .