uri); //get the playtime from the current transcoder $duration = $this->get_playtime($videopath); $files = array(); 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 = $this->load_movie($videopath); if (!$movie) { return $files; } $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); if (!$frame || !imagejpeg($frame->toGDImage(), drupal_realpath($thumbfile))) { $error_param = array('%file' => $thumbfile); $error_msg = t("Error generating thumbnail for video: generated file %file does not exist.", $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 = $this->load_movie($video); return (!$movie) ? 0 : $movie->getDuration(); } /** * Return the dimensions of a video */ public function get_dimensions($video) { $movie = $this->load_movie($video); if (!$movie) { return array( 'width' => 0, 'height' => 0, ); } $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); } }