Bài viết này sẽ hướng dẫn bạn cách chuyển đổi hình ảnh thành video bằng công cụ: FFmpeg . Ngoài ra, chúng ta cũng sẽ xem cách bạn có thể thêm đoạn âm thanh vào video cũng như cách thêm hiệu ứng chuyển tiếp vào các slide hình ảnh.
Tạo slideshow hình ảnh bằng FFmpeg
FFmpeg là một công cụ dòng lệnh mã nguồn mở có thể được sử dụng để xử lý video, âm thanh cũng như các tệp và luồng đa phương tiện khác. Nó có nhiều trường hợp sử dụng, một số trường hợp bao gồm tạo video từ hình ảnh, trích xuất hình ảnh từ video, nén video, thêm văn bản vào video, thêm/xóa âm thanh khỏi video, cắt các đoạn khỏi video, v.v.Một số hệ điều hành, chẳng hạn như Ubuntu, cài đặt FFmpeg theo mặc định, vì vậy bạn có thể thấy rằng mình đã có nó trên máy tính của mình. Bạn có thể kiểm tra xem nó đã được cài đặt chưa bằng lệnh sau:
$ ffmpeg -versionNếu nó cung cấp cho bạn số phiên bản thì bạn có thể tiếp tục, nếu không, trước tiên bạn nên truy cập trang web ffmpeg, tải xuống và cài đặt một bản sao cho hệ điều hành cụ thể của mình.
Tạo video trình chiếu từ một chuỗi hình ảnh
Để tạo video từ một chuỗi hình ảnh bằng FFmpeg, bạn cần chỉ định hình ảnh đầu vào và tệp đầu ra. Có một số cách bạn có thể chỉ định hình ảnh đầu vào và chúng ta sẽ xem xét các ví dụ về một số cách này.Công cụ xác định định dạng FFmpeg
Nếu bạn có một loạt hình ảnh được đặt tên tuần tự, ví dụ happy1.jpg: happy2.jpg, happy3.jpg, happy4.jpg, v.v., bạn có thể sử dụng công cụ xác định định dạng ffmpeg để chỉ ra những hình ảnh mà FFmpeg nên sử dụng:$ ffmpeg -framerate 1 -i happy%d.jpg -c:v libx264 -r 30 output.mp4Lệnh trên lấy đầu vào là hình ảnh, -i happy%d.jpg. Thao tác này sẽ tìm kiếm hình ảnh có chữ số thấp nhất và đặt hình ảnh đó làm hình ảnh bắt đầu. Sau đó nó sẽ tăng số đó lên một và nếu hình ảnh tồn tại, nó sẽ được thêm vào chuỗi. Bạn có thể tự chỉ định hình ảnh bắt đầu bằng -start_number n, Nếu chúng tôi đã thêm -start_number 3 vào lệnh trên, hình ảnh bắt đầu sẽ là happy3.jpg.
Các tùy chọn luôn được viết trước tệp mà chúng đề cập đến, vì vậy trong ví dụ của chúng tôi, -framerate 1 -i là các tùy chọn được sử dụng cho hình ảnh đầu vào và -c:v libx264 -r 30 là các tùy chọn cho tệp đầu ra.
Chúng tôi sử dụng -framerate 1 để xác định tốc độ đọc ảnh, trong trường hợp này là 1 ảnh mỗi giây. Việc bỏ qua tốc độ khung hình sẽ mặc định ở tốc độ khung hình là 25.
-r 30 là tốc độ khung hình của video đầu ra. Một lần nữa, nếu chúng ta không xác định nó, nó sẽ mặc định là 25.
Phần này -c:v libx264 chỉ định codec được sử dụng để mã hóa video. x264 là thư viện được sử dụng để mã hóa các luồng video sang định dạng nén AVC H.264/MPEG-4.
Bạn có thể xem video kết quả dưới đây:
$ ffmpeg -framerate 1 -i happy%d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
Sử dụng glob pattern
Bạn có thể chỉ định hình ảnh đầu vào sẽ được sử dụng trong video bằng glob pattern. Mẫu *.jpg được sử dụng bên dưới sẽ chọn tất cả các tệp có tên kết thúc .jpgtừ thư mục hiện tại. Các file phù hợp sẽ được sắp xếp theo LC_COLLATE. Điều này hữu ích nếu bạn có các hình ảnh được đặt tên theo thứ tự nhưng không nhất thiết phải theo thứ tự số liên tiếp.
$ ffmpeg -framerate 1 -pattern_type glob -i '*.jpg' -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4Ở trên sẽ dẫn đến một video tương tự như những gì chúng tôi đã có trước đây.
FFmpeg piping
Bạn cũng có thể sử dụng cat để chuyển sang ffmpeg:
$ cat *.jpg | ffmpeg -framerate 1 -f image2pipe -i - -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
Sử dụng bộ giải mã concat FFmpeg
Bạn có thể sử dụng bộ giải mã concat để ghép các hình ảnh được liệt kê trong một tệp.Dưới đây, chúng ta tạo một file có nhãn input.txt và thêm danh sách hình ảnh cho slideshow. Chúng tôi chỉ định thời lượng (2 giây) mà mỗi hình ảnh sẽ được hiển thị. Bạn có thể chỉ định thời lượng khác nhau cho mỗi hình ảnh:
file 'happy1.jpg'Sau đó, chúng tôi chạy lệnh sau để xuất trình chiếu video của hình ảnh:
duration 2
file 'happy2.jpg'
duration 2
file 'happy3.jpg'
duration 2
file 'happy4.jpg'
duration 2
file 'happy5.jpg'
duration 2
file 'happy6.jpg'
duration 2
$ ffmpeg -f concat -i input.txt -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
Thêm âm thanh vào trình chiếu video
Bạn có thể làm cho trình chiếu video của mình thú vị hơn bằng cách thêm đoạn âm thanh vào đó:$ ffmpeg -framerate 1 -pattern_type glob -i '*.jpg' -i freeflow.mp3 \Ở trên thêm một tệp đầu vào thứ hai -i freeflow.mp3 là tệp âm thanh.
-shortest -c:v libx264 -r 30 -pix_fmt yuv420p output6.mp4
Tùy -shortest chọn đặt độ dài của video đầu ra là độ dài ngắn nhất trong hai tệp đầu vào. Vì tệp âm thanh của chúng tôi dài hơn bản trình chiếu của sáu hình ảnh nên độ dài của video đầu ra chính là độ dài của bản trình chiếu.
Bạn có thể xem video với đoạn âm thanh được thêm vào bên dưới:
Thêm hiệu ứng chuyển tiếp vào trình chiếu video
Bạn có thể cải thiện hơn nữa trình chiếu video bằng cách thêm một số hiệu ứng khi chuyển từ hình ảnh này sang hình ảnh khác.Phần sau đây thêm hiệu ứng mờ dần vào hình ảnh:
$ ffmpeg \Tùy -t chọn chỉ định thời lượng tính bằng giây của mỗi hình ảnh và -loop 1 lặp lại hình ảnh. Chúng tôi thêm một tệp âm thanh -i freeflow.mp3 và sau đó thêm một số cấu hình để filter_complex thêm hiệu ứng mờ dần.
-loop 1 -t 5 -i happy1.jpg \
-loop 1 -t 5 -i happy2.jpg \
-loop 1 -t 5 -i happy3.jpg \
-loop 1 -t 5 -i happy4.jpg \
-loop 1 -t 5 -i happy5.jpg \
-loop 1 -t 5 -i happy6.jpg \
-i freeflow.mp3 \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
[1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
[2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
[3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
[4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
[5:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v5]; \
[v0][v1][v2][v3][v4][v5]concat=n=6:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 6:a -shortest output7.mp4
Một số hình ảnh chúng tôi đang sử dụng có kích thước khác nhau, vì vậy chúng tôi sử dụng scalewith pad để điều chỉnh hình ảnh theo một kích thước cụ thể, làm cho chúng đồng nhất. fadelàm mờ dần hình ảnh trong hoặc ngoài, dđặt thời lượng làm mờ và stchỉ định thời điểm bắt đầu làm mờ.
Sau đây là video kết quả: