Video trình chiếu cung cấp một cách tuyệt vời để chụp từng bức ảnh riêng lẻ và biến chúng thành những câu chuyện có ý nghĩa và đầy đủ hơn được kể qua video. Bạn thậm chí có thể làm cho trình chiếu hấp dẫn hơn bằng cách thêm văn bản cũng như các hiệu ứng đồ họa khác.
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.
Cách dùng FFmpeg chuyển ảnh sang video

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 -version
Nế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.mp4
Lệ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:
Bạn có thể thêm -vf format=yuv420p hoặc -pix_fmt yuv420p (khi đầu ra của bạn là H.264) để tăng khả năng tương thích của video với nhiều trình phát:
$ 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'
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
Sau đó, chúng tôi chạy lệnh sau để xuất trình chiếu video của hình ảnh:
$ 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 \
-shortest -c:v libx264 -r 30 -pix_fmt yuv420p output6.mp4
Ở trên thêm một tệp đầu vào thứ hai -i freeflow.mp3 là tệp âm thanh.
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 \
-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
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.
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ả:

Phần kết luận

FFmpeg là một công cụ xử lý đa phương tiện linh hoạt có thể được sử dụng để tạo và chỉnh sửa nhiều loại phương tiện, bao gồm cả video. Chúng tôi đã biết cách sử dụng nó để tạo video từ một chuỗi hình ảnh. Vấn đề khi sử dụng FFmpeg là nó có thể khó sử dụng và cần có một số kiến ​​thức về công cụ cũng như các tùy chọn của nó để có thể sử dụng đúng cách nhằm đạt được kết quả đầu ra chính xác mà bạn muốn.