From 598c46cf31bd0d786cb5907ca5f23c034cce247e Mon Sep 17 00:00:00 2001 From: Silvio Date: Tue, 5 Jul 2011 17:42:46 -0300 Subject: 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. --- transcoders/video_ffmpeg_php.inc | 190 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 transcoders/video_ffmpeg_php.inc 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 @@ +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.
Command Executed:
%cmd
Command Output:
%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); + } + +} -- cgit v1.2.3