diff options
author | Silvio <silvio@devlet.com.br> | 2011-07-05 17:42:46 -0300 |
---|---|---|
committer | Silvio <silvio@devlet.com.br> | 2011-07-05 17:42:46 -0300 |
commit | 598c46cf31bd0d786cb5907ca5f23c034cce247e (patch) | |
tree | 8f41aed63c1c62a0289f42921de422f641a87500 | |
parent | 2929a463991a15192cd78b1242b401c2c9643613 (diff) | |
download | video-598c46cf31bd0d786cb5907ca5f23c034cce247e.tar.gz video-598c46cf31bd0d786cb5907ca5f23c034cce247e.tar.bz2 |
Adding video_ffmpeg_php transcoder
This transcoder extends video_ffmpeg and uses ffmpeg-php extension
to get duration, dimensions and generating thumbnails.
This allows the video module to run in a restricted environment
where exec() and variants are not available.
-rw-r--r-- | transcoders/video_ffmpeg_php.inc | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/transcoders/video_ffmpeg_php.inc b/transcoders/video_ffmpeg_php.inc new file mode 100644 index 0000000..478c333 --- /dev/null +++ b/transcoders/video_ffmpeg_php.inc @@ -0,0 +1,190 @@ +<?php + +/* + * @file + * Transcoder class file to handle ffmpeg settings and conversions. + */ + +// Make sure that the parent class is included. +include_once 'video_ffmpeg.inc'; + +class video_ffmpeg_php extends video_ffmpeg implements transcoder_interface { + + // Naming for our radio options. Makes it easy to extend our transcoders. + private $name = 'FFMPEG-PHP (Use ffmpeg-php when possible)'; + private $value = 'video_ffmpeg_php'; + + /** + * Constructor. Just call the parent. + */ + public function __construct() { + parent::__construct(); + } + + /** + * Generate video thumbs. + * + * @todo + * Use php-ffmpeg API instead of run_command(). + */ + public function generate_thumbnails($video) { + global $user; + // Setup our thmbnail path. + $video_thumb_path = variable_get('video_thumb_path', 'videos/thumbnails'); + // Get the file system directory. + // @todo : get the field file system settings to this + $schema_thumb_path = file_default_scheme() . '://' . $video_thumb_path . '/' . $video['fid']; + file_prepare_directory($schema_thumb_path, FILE_CREATE_DIRECTORY); + // Total thumbs to generate + $total_thumbs = variable_get('video_thumbs', 5); + $videofile = file_load($video['fid']); + //get the actual video file path from the stream wrappers + $videopath = drupal_realpath($videofile->uri); + //get the playtime from the current transcoder + $duration = $this->get_playtime($videopath); + + $files = NULL; + for ($i = 1; $i <= $total_thumbs; $i++) { + $seek = ($duration / $total_thumbs) * $i - 1; //adding minus one to prevent seek times equaling the last second of the video + $filename = file_munge_filename("video-thumb-" . $video['fid'] . "-$i.jpg", '', TRUE); + $thumbfile = $schema_thumb_path . '/' . $filename; + //skip files already exists, this will save ffmpeg traffic + if (!is_file(drupal_realpath($thumbfile))) { + // Use PHP-FFMPEG + $movie = new ffmpeg_movie($videopath); + $frames = $movie->getFrameCount(); + $fps = $movie->getFrameRate(); + + // Get the right frame number + $framenumber = (int) $seek * $fps; + if ($framenumber > $frames) { + $framenumber = $frames; + } + + // Get the frame and create thumb file + $frame = $movie->getFrame($framenumber); + $thumb = $frame->toGDImage(); + imagejpeg($thumb, drupal_realpath($thumbfile)); + + if (!file_exists(drupal_realpath($thumbfile))) { + $error_param = array('%file' => $thumbfile, '%cmd' => $command, '%out' => $command_output); + $error_msg = t("Error generating thumbnail for video: generated file %file does not exist.<br />Command Executed:<br />%cmd<br />Command Output:<br />%out", $error_param); + // Log the error message. + watchdog('transcoder', $error_msg, array(), WATCHDOG_ERROR); + continue; + } + } + // Begin building the file object. + // @TODO : use file_munge_filename() + $file = new stdClass(); + $file->uid = $user->uid; + $file->status = 0; + $file->filename = trim($filename); + $file->uri = $thumbfile; + $file->filemime = file_get_mimetype($filename); + $file->filesize = filesize(drupal_realpath($thumbfile)); + $file->timestamp = time(); + $files[] = $file; + } + return $files; + } + + /** + * Return the playtime seconds of a video + */ + public function get_playtime($video) { + $movie = new ffmpeg_movie($video); + return $movie->getDuration(); + } + + /** + * Return the dimensions of a video + */ + public function get_dimensions($video) { + $movie = new ffmpeg_movie($video); + $res['width'] = $movie->getFrameWidth(); + $res['height'] = $movie->getFrameHeight(); + return $res; + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#get_name() + */ + public function get_name() { + return $this->name; + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#get_value() + */ + public function get_value() { + return $this->value; + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#get_help() + */ + public function get_help() { + return l(t('FFMPEG-PHP Online Manual'), 'http://ffmpeg-php.sourceforge.net/'); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#admin_settings() + */ + public function admin_settings() { + return parent::admin_settings(); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#admin_settings_validate() + */ + public function admin_settings_validate($form, &$form_state) { + return; + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#create_job() + */ + public function create_job($video, $nid) { + return parent::create_job($video, $nid); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#delete_job() + */ + public function delete_job($video) { + return parent::delete_job($video); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#load_job() + */ + public function load_job($fid) { + return parent::load_job($fid); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#load_job_queue() + */ + public function load_job_queue() { + return parent::load_job_queue(); + } + + /** + * Interface Implementations + * @see sites/all/modules/video/includes/transcoder_interface#load_completed_job() + */ + public function load_completed_job(&$video) { + return parent::load_completed_job($video); + } + +} |