FFMPEG là một thư viện phần mềm có rất nhiều tiện ích cho việc xử lí dữ liệu 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. Ngoài ra, chúng ta cũng có thể dùng FFMPEG để cắt ra một đoạn video, hoặc các frames trong đó.
Tôi trước giờ chỉ xài FFMPEG ở mức command line. Tuy nhiên, lần này do cần phải lấy keyframes trong các video shots, nên buộc phải dùng ở dạng thư viện. FFMPEG ở command line cũng có cung cấp tính năng lấy keyframes, tuy nhiên cách lấy keyframes như thế nào thì tôi ko thể kiểm sóat được nên mới buộc phải đụng đến thư viện.
Do nhu cầu cũng khá đơn giản, chỉ cần mở video, nhảy đến frame cần lấy ra, trích ra file jpg, nên tôi cũng ko cần phải đụng đến thư viện ở dạng C++. Thay vào đó, tôi dùng FFMPEG-PHP, một kiểu wrapping để có thể dùng các hàm của FFMPEG trong PHP.
Câu chuyện đến đây mới bắt đầu phức tạp. Tôi cần phải chạy mấy thứ này trên Linux và ko có quyền root để cài đặt phần mềm. Trên Linux, bạn thường phải build from source chứ ko có một cục install như trên Windows. Nếu bạn có quyền root thì mọi chuyện sẽ khá đơn giản, có lẽ chỉ cần download source code về, gõ ./configure, sau đó là make, và cuối cùng là make install. Ngoài ra, khi build from source, khi có lỗi, chẳng biết đường nào mà lần. Nếu phần mềm bạn cài xài thư viện A cũ hơn thư viện đang có trong máy thì có khi bạn cũng chẳng build được. Do đó, nếu cài mấy thứ này trên Windows, có thể chỉ một buổi là xong, dân ko chuyên như tôi phải mất vài ngày. Cài xong cũng phải lo ghi lại chứ lần sau lại quên. Note này ghi lại quá trình cài đặt và sử dụng FFMPEG-PHP. Hi vọng sẽ giúp các bạn đi sau.
1. Requirements
- FFMPEG-PHP đòi hỏi phải có PHP và FFMPEG đã được install trước đó.
- PHP phải được install có hỗ trợ thư viện GD.
- FFMPEG phải được install với --enable-shared
- Phiên bản tôi dùng để cài đặt:
+ PHP 5.3.6
+ FFMPEG: 0.6
+ FFMPEG-PHP: 0.6.0
2. Install PHP
Thông thường nếu install ở quyền root, tập tin thi hành sẽ được chép vào /usr/bin, tập tin thư viện (.so, .a) chép vào /usr/lib, tập tin header (.h) thì chép vào /usr/include. Có khi là /usr/local thay cho /usr. Do tôi install ko có quyền root, tức là install cho mình xài, nên tôi tổ chức 2 thư mục: usr.source để chứa các source download từ Internet, và thư mục usr.local, đóng vai trò như là thư mục /usr đã nói ở trên. Thông thường lệnh make install sẽ chép các tập tin tương ứng sau khi đã dịch và liên kết xong từ usr.source sang usr.local.
Để yêu cầu PHP khi install hỗ trợ thư viện GD, cần phải hiệu chỉnh lệnh configure. Cụ thể lệnh như sau (gõ trong thư mục usr.source/php-5.3.6):
./configure --prefix=/net/per900b/raid0/ledduy/usr.local --with-gd --with-jpeg-dir=/net/per900b/raid0/ledduy/usr.local --with-png-dir=/net/per900b/raid0/ledduy/usr.local
--prefix=DIR, dùng để yêu cầu thư mục install (nếu ko chỉ định, mặc định sẽ là /usr, và chỉ có quyền root mới dùng được).
--with-gd, dùng để yêu cầu install thư viện GD.
--with-jpeg-dir=DIR và --with-png-dir=DIR, dùng để chỉ định đường dẫn đến thư viện JPEG và PNG đã được cài đặt trước đó.
Rắc rối nằm ở chỗ --with-jpeg-dir, bởi vì libjpeg phải được cài đặt trước đó. Cũng may là hai thư viện này đã được root cài sẵn rồi. Nhưng ngặt một nỗi khi install, PHP tìm tập tin libjpeg.so trong mấy thư mục như usr/lib ko có. Lí do là libjpeg.so nằm trong usr/lib64. Giải pháp là tạo một symlink tới nó và symlink này đặt trong usr.local/lib vì usr/lib ko đặt được do ko phải root.
ln -s /usr/lib64/libjpeg.so libjpeg.so (chạy lệnh này trong thư mục usr.local/lib)
ln -s /usr/lib64/libpng.so libpng.so
Một lưu ý khác là DIR chỉ định trong --with-jpeg-dir ko phải là usr.local/lib mà PHẢI là usr.local vì chương trình install tự động cộng thêm lib vào DIR để kiếm. Do đó, symlink mà tạo ở thư mục ko phải lib cũng ko được.
Vẫn còn một rắc rối nữa là sẽ bị báo lỗi ko kiếm được tập tin png.h. Do đó phải tạo một symlink tới png.h đặt trong usr.local/include.
ln -s /usr/include/png.h png.h (chạy lệnh này trong thư mục usr.local/include)
Sau khi thiết lập các symlink xong, chạy lệnh ./configure như trên. Nếu suôn sẻ thì chạy tiếp các lệnh như make clean, make và make install. Lỗi thường xảy ra khi máy chưa cài đặt các thư viện cần cho cài đặt PHP, do đó nếu có thì phải cài đặt cho xong, rồi quay lại cài tiếp PHP.
3. Install FFMPEG
Cũng qua 3 bước ./configure, make và make install. Điểm chú ý là trong ./configure phải chỉ định --enable-shared.
./configure --prefix=/net/per900b/raid0/ledduy/usr.local/ --enable-shared
Thực ra còn nhiều thứ để cấu hình FFMPEG nữa nhưng tạm thời xài mặc định là OK.
4. Install FFMPEG-PHP
Lưu ý là FFMPEG-PHP chỉ cài đặt sau khi đã cài xong PHP (có hỗ trợ GD) và FFMPEG.
Lệnh đầu tiên là phpize. Do máy có thể đã cài sẵn php nên tốt nhất là chạy từ usr.local/bin/phpize. Lưu ý là lệnh này phải được chạy trong thư mục ffmpeg-php-0.6.0. Chạy ở ngòai sẽ có lỗi ngay
Sau đó là chạy lệnh ./configure.
./configure --with-ffmpeg=/net/per900b/raid0/ledduy/usr.local --prefix=/net/per900b/raid0/ledduy/usr.local --with-php-config=/net/per900b/raid0/ledduy/usr.local/bin/php-config
--prefix=DIR, dùng để chỉ định thư mục install
--with-ffmpeg=DIR, dùng để chỉ định thư mục cài đặt FFMPEG trước đó. Lưu ý là DIR ko phải là thư mục lib mà là thư mục chỉ định trong --prefix khi cài đặt FFMPEG (tức là usr.local).
--with-php-config=PATH, dùng để chỉ định file thi hành php-config. Cần phải chỉ rõ ràng vì có thể máy đã cài php sẵn nên sẽ lấy cấu hình của php do root cài, chứ ko phải là PHP vừa được cài ở usr.local.
Sau đó chạy make và make install.
Bước tiếp theo là chỉnh file php.ini, thêm dòng lệnh extension=ffmpeg.so. Thực ra có thể load trực tiếp trong code php như chỉ dẫn:
$extension = "ffmpeg";
$extension_soname = $extension . "." . PHP_SHLIB_SUFFIX;
$extension_fullname = PHP_EXTENSION_DIR . "/" . $extension_soname;
// load extension
if(!extension_loaded($extension)) {
dl($extension_soname) or die("Can't load extension $extension_fullname\n");
}?>
Sau khi cài đặt xong, dùng cũng tương đối đơn giản. Các lệnh chính gồm:
- $movie = new ffmpeg_movie (movie_file_name), lệnh này dùng để mở tập tin movie.
- $image = $movie->getFrame($nFrameID), lệnh này dùng để lấy frame ở offset $nFrameID. Nếu chỉ có timecode thì phải kết hợp với $movie->getFrameRate() để lấy frame rate trước.
- $gdImage = $image->toGDImage(), lệnh này dùng để chuyển đối tượng ffmpeg_frame sang GD image.
- imagejpeg($gdImage, keyframe_file_name, 100), lệnh này dùng để lưu ảnh ra tập tin. Tham số cuối cùng là quality, 100 là best, mặc định là 75. Dùng 100 để đảm bảo keyframe lấy ra đúng như chất lượng đã encode.
Nói một cách tóm tắt, cần lưu ý các điểm sau khi cài đặt FFMPEG-PHP
1. FFMPEG-PHP phải được cài sau khi cài xong PHP và FFMPEG
2. Thư mục DIR trong các option như --with-ffmpeg=DIR ko phải là thư mục chứa thư viện, thay vào đó là thư mục cha để từ đó cộng thêm lib hoặc include.
Với việc cài đặt và dùng FFMPEG-PHP, tôi có thêm công cụ rất mạnh để có thể xử lí các video sau này.
Đăng nhận xét