Sử dụng FFmpeg và PHP để xử lý video

Cập nhật ngày 4, Tháng Mười, 2023, Thuộc Graphic Media, PHP, Server/Hosting
Sử dụng FFMPEG và PHP để xử lý video

Có khá nhiều bạn email về Trung Tâm Tin Học hỏi vấn đề làm sao để chụp screenshot làm thumbnail của video trên server một cách tự động mỗi khi upload. Hôm nay mình xin giới thiệu FFMPEG – một multimedia framework nổi tiếng để làm việc đó.

FFmpeg là một thư viện có rất nhiều tiện ích cho việc xử lý video. Tính năng nổi bật nhất có lẽ là khả năng encode/decode nhiều video format khác nhau, giúp convert qua lại nhiều định dạng video. Ngoài ra, chúng ta cũng có thể dùng FFmpeg để cắt một đoạn video, crop video, chụp lại các frame và xuất ra dạng hình ảnh,…

Điều đó với các bạn dùng Windows thì có khối phần mềm để làm, nhưng nếu bạn muốn làm những việc sau, bạn buộc sẽ cần dùng đến FFmpeg

  • Convert qua lại các định dạng video flv, mp4, avi,…
  • Convert đồng loạt các video trong các thư mục khác nhau.
  • Cắt một đoạn trong các video.
  • Tự động convert video từ mp4, avi sang flv (hoặc ngược lại) mỗi khi upload chúng lên server.
  • Chụp screenshot, crop và tự động chụp screenshot làm thumbnail từ 1 frame bất kì của video khi video vừa được upload lên.

FFMPEG có thể làm được rất nhiều tác vụ về xử lý dữ liệu video. Phần trên chỉ là liệt kê một số việc hay gặp, các bạn có thể đọc thêm ở đây  http://ffmpeg.org/about.html và document của nó để tiếp cận cả một bầu trời mới với loại dữ liệu mới là video.

Phần dưới đây sẽ hướng dẫn cài đặt FFmpeg và FFmpeg-php

Cài đặt FFMPEG

Toàn bộ hướng dẫn cài đặt chi tiết từng bước cho Centos và Ubuntu có tại FFmpeg Compilation Guide, các bạn chỉ cần làm theo đúng hướng dẫn là thành công mỹ mãn. Phần dưới đây mình chỉ hướng dẫn cài trên server Centos 5.x mà trong tài liệu của FFmpeg không nói đến. Cách dưới này mình đã áp dụng thành công trên server Centos 5.7 có cài sẵn WHM/Cpanel (khá phổ biến cho các bạn đã thuê một dedicate server để xây webserver cho hệ thống website), nên nếu bạn nào có server tương tự thì yên tâm sử dụng nhé.

1. Cài RPMForge i386 YUM Repository nếu chưa có

# rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

2. Sử dụng yum để cài gói FFmpeg

# yum install ffmpeg ffmpeg-devel ffmpeg-libpostproc opencore-amr

Sau khi yum cài ffmpeg và các gói liên quan hoàn tất, bạn có thể sử dụng ngay FFmpeg.

Dùng FFmpeg để convert video

Câu lệnh khá đơn giản, Ví dụ:FLV sang MP4

# ffmpeg -i abc.flv abc.mp4

FLV sang AVI

# ffmpeg -i abc.flv abc.avi

Thay đổi bit-rate của video sang 64kbit/s

# ffmpeg -i abc.avi -b:v 64k def.avi

Thay đổi frame-rate của video sang 24 fps

# ffmpeg -i abc.avi -r 24 def.avi

Xem thêm các tham số khác tại http://ffmpeg.org/ffmpeg.html

Sử dụng FFmpeg trong PHP với phần mở rộng FFmpeg-php

Cài đặt FFmpeg-php

Lấy file# wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2

Giải nén

# tar -xjf ffmpeg-php-0.6.0.tbz2

# cd ffmpeg-php-0.6.0

Biên dịch

# phpize

# ./configure

# make

# make install

Thêm dòng sau vào php.ini để nó load extension lên tự động:



extension=ffmpeg.so

Thêm trực tiếp vào php.ini hoặc thông qua file .ini trong thư mục include extension đều được. Tùy thuộc vào server của bạn mà vị trí file php.ini có thể khác nhau (thường /etc/php.ini).

Sử dụng FFmpeg trong php

Sau khi cài đặt xong, dùng cũng tương đối đơn giản. Xem các Object menthod PHP của nó tại FFmpeg-php API

Mình có viết sẵn một hàm dùng để lấy screenshoot của video và một hàm dùng php để convert video dùng FFmpeg

Server bạn phải có cài thư viện GD mới thực hiện được hàm getthumbFromVideo()

function convertFormat($input, $output) {

   $command = “ffmpeg -i $input $output”;

   shell_exec( $command );

}



function getthumbFromVideo($input, $output, $frameid=1) {

$movie = new ffmpeg_movie ($input);

$image = $movie->getFrame($frameid);

$gdImage = $image->toGDImage();

imagejpeg($gdImage, $output, 100);

}

Riêng hàm getthumbFromVideo mình lấy đại cái $frameid = 1, bạn nào siêng tí thì viết rồi share cái hàm dựa vào $movie->getFrameRate() để có hàm lấy screenshot của 1 thời điểm bất kỳ :)

Chúc các bạn thành công.

Trần Triệu Phú – www.trungtamtinhoc.edu.vn
(Vui lòng ghi nguồn khi đăng lại bài viết này)



Click Xem thêm: , , , , , , , ,