2012-02-13 37 views
11

Giả sử tôi có 10 hình ảnh và tôi muốn kết hợp những hình ảnh đó trong một video như trình chiếu.Làm cách nào để tạo video từ hình ảnh bằng php?

Ví dụ: tôi muốn hiển thị mỗi hình ảnh trong 5 giây và sau đó tiếp tục với hình ảnh tiếp theo thêm 5 giây nữa.

Nếu có thể, nó sẽ là hoàn hảo để bao gồm âm nhạc và một số văn bản mô tả quá.

Có mã mẫu cho điều này có thể là với thư viện ffmpeg không?

Trả lời

9

Suy nghĩ đầu tiên của tôi là đưa ra lệnh ffmpeg với thông tin như thế này.

Tạo video từ hình ảnh

ffmpeg có thể được sử dụng để ghép nhiều hình ảnh lại với nhau thành một đoạn video. Có nhiều tùy chọn, nhưng ví dụ sau đây là đủ để bắt đầu. Phải mất tất cả các hình ảnh có tên tệp là XXXXX.morph.jpg, trong đó X là số và tạo video có tên là "output.mp4". Tùy chọn qscale chỉ định chất lượng hình ảnh (1 là mức cao nhất và 32 là thấp nhất) và tùy chọn "-r" được sử dụng để chỉ định số khung hình trên giây.

ffmpeg -r 25 -qscale 2 -i% 05d.morph.jpg output.mp4

(Trang web blurb này được lấy từ biến mất. Liên kết đã bị xoá.)

Trong đó 25 có nghĩa là 25 hình ảnh mỗi giây. Bạn có thể đặt giá trị này thành 1 cho độ trễ nhỏ (1 giây) hoặc sử dụng số thập phân, IE: 0,5 cho thời gian trễ là 2 giây.

Sau đó, bạn có thể kết hợp luồng video và âm thanh với nội dung như thế này.

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -b:a 128k final.mp4 

Tất nhiên chọn codec thích hợp của bạn. Nếu bạn muốn sử dụng mp4 libx264 cho video và aac (được tích hợp vào ffmpeg và không còn "thử nghiệm") cho âm thanh.

Chỉ cần nhớ rằng nếu bạn chọn sử dụng một phương pháp như thế này, đầu ra ffmpeg sẽ xuất hiện, theo mặc định, thành stderr khi bạn cố gắng đọc nó. Nó có thể được chuyển hướng đến stdout nếu bạn thích.

+0

ok, vì vậy chúng tôi có thể chọn khung hình mỗi giây nhưng là điều đó có nghĩa là chúng tôi có thể xác định thời lượng của video bằng cách tăng fps? ví dụ: nếu 25 khung hình/giây là 1 giây. Sử dụng 'ffmpeg -r 250' có nghĩa là 10 giây cho mỗi ảnh không? – motto

+0

Không, nó sẽ sử dụng 25 hình ảnh mỗi giây. 25 chỉ là ví dụ sao chép/dán. Hãy thử đặt nó thành 1 hoặc thậm chí 0,5 trong 2 giây tạm dừng. Tôi cũng đã thêm thông tin này vào bài đăng. – Timeout

+0

URL không hoạt động. –

5

Điều đầu tiên tôi nghĩ đến là imagemagick. Tôi đã sử dụng nó với PHP cho rất nhiều thao tác hình ảnh và tôi biết nó hỗ trợ đọc một số lượng phong nha của các định dạng video và theo liên kết đó nó hỗ trợ bằng văn bản cho một số quá.

+2

imagick yêu cầu ffmpeg nên về cơ bản không có lợi thế trong việc sử dụng cho thao tác video với php ... – Michal

4

có, ffmpeg là giải pháp phù hợp với bạn. tôi vừa mới làm một cái gì đó tương tự - một trang video với hình thu nhỏ động. tôi đã sử dụng ffmpeg để ghép các hình ảnh lại với nhau thành một hình gif bị biến dạng. Tuy nhiên, đầu ra có thể là bất cứ thứ gì bạn cần ... không may, trong các tìm kiếm của tôi vào chủ đề này tôi đã không tìm thấy bất kỳ mã mẫu nào sẽ kết hợp tất cả các điểm bạn đang theo dõi, vì vậy tôi cho rằng bạn sẽ phải thử bằng tay với ffmpeg .. trong dự án của tôi, tôi sử dụng bộ công cụ video php http://sourceforge.net/projects/phpvideotoolkit/ ở một số phần để làm cho nó dễ dàng hơn một chút ...

2

Bạn có thể sử dụng hiệu ứng pha trộn với ffmpeg:

ffmpeg -framerate 20 \ 
-loop 1 -t 0.5 -i 1.jpg \ 
-loop 1 -t 0.5 -i 2.jpg \ 
-loop 1 -t 0.5 -i 3.jpg \ 
-loop 1 -t 0.5 -i 4.jpg \ 
-c:v libx264 \ 
-filter_complex " \ 
[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \ 
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \ 
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \ 
[0:v][b1v][1:v][b2v][2:v][b3v][3:v]concat=n=7:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4 

Bạn nên kiểm tra liên kết dưới đây cho hiệu quả hơn về ffmpeg: D

https://github.com/letungit90/ffmpeg_memo

+0

tks cho phản hồi @LordNeckbeard i cập nhật câu trả lời của tôi – Makio

Các vấn đề liên quan