Last updated February 22, 2010. Created by heshan.lk on February 22, 2010.
Log in to edit this page.
Here I'm adding ffmpeg converter file which is ship by default, to create new converter for your own, then what you need to do is extend hook_auto_convert() and hook_auto_thumbnail. Other functions are supporting functions.
What you need to do is, create your plugin file and copy it to plugins folder, make sure your hook should be same as file name.
<?php
//$Id: ffmpeg.inc,v 1.1.2.14 2010/02/13 11:31:28 heshanmw Exp $
/**
* @file
* Provide a api for video conversion and auto thumbnailing using ffmpeg.
*
* @author Heshan Wanigasooriya <heshan at heidisoft.com, heshanmw at gmail dot com>
* TODO: add common settings from video module configurations and extend it from ffmpeg.inc
* since we need to have executable path of ffmpeg to ffmpeg.inc we need to have it
*/
/**
* Define some constants
*/
defined('VIDEO_RENDERING_PENDING')
or define('VIDEO_RENDERING_PENDING', 1);
defined('VIDEO_RENDERING_ACTIVE')
or define('VIDEO_RENDERING_ACTIVE', 5);
defined('VIDEO_RENDERING_COMPLETE')
or define('VIDEO_RENDERING_COMPLETE', 10);
defined('VIDEO_RENDERING_FAILED')
or define('VIDEO_RENDERING_FAILED', 20);
// nice value to append at the beginning of the command
defined('VIDEO_RENDERING_NICE')
or define('VIDEO_RENDERING_NICE', 'nice -n 19');
/**
* Generates a thumbnail from the video file
* Implementing hook_auto_thumbnail on inc
*
* @param $vidfile
* object with element information
*
* @return
* a drupal file objects
*/
function ffmpeg_auto_thumbnail($vidfile) {
global $user;
$uploaded_file = $vidfile;
$fid = $uploaded_file["fid"];
// are we debugging?
// escape the filename for safety
$videofile = escapeshellarg($uploaded_file['filepath']);
$thumb_path = variable_get('video_thumb_path', 'video_thumbs');
//files will save in files/video_thumbs/#fileId folder
$tmp = file_directory_path(). '/' . $thumb_path . '/' . $fid;
// Ensure the destination directory exists and is writable.
$directories = explode('/', $tmp);
// array_pop($directories); // Remove the file itself.
// Get the file system directory.
$file_system = file_directory_path();
foreach ($directories as $directory) {
$full_path = isset($full_path) ? $full_path . '/' . $directory : $directory;
// Don't check directories outside the file system path.
if (strpos($full_path, $file_system) === 0) {
field_file_check_directory($full_path, FILE_CREATE_DIRECTORY);
}
}
$count = variable_get('no_of_video_thumbs', 5);
$duration = ffmpeg_auto_playtime($vidfile);
$files = NULL;
for($i = 1; $i <= $count; $i++) {
// get ffmpeg configurations
$seek = ($duration/$count) * $i;
$thumbfile = $tmp . "/video-thumb-for-$fid-$i.png";
//skip files already exists, this will save ffmpeg traffic
if (!is_file($thumbfile)) {
$tnail = variable_get('video_transcoder_path', '/usr/bin/ffmpeg');
$options = preg_replace(array('/%videofile/', '/%thumbfile/', '/%seek/'), array($videofile, $thumbfile, $seek), variable_get('video_ffmpeg_thumbnailer_options', '-i %videofile -an -y -f mjpeg -ss %seek -vframes 1 %thumbfile'));
// $options = preg_replace(array('/%videofile/', '/%tmp/', '/%id/', '/%interval/'), array($videofile, $tmp, $i, ($duration/$count)), variable_get('video_image_thumbnailer_options', '-ss %id*%interval -i %videofile -vframes 1 %thumbfile'));
// ffmpeg -ss $i*$interval -i intro.mov -vframes 1 -s 320x240 thumb_$i.jpg
//ffmpeg -i superstunt_8uiarzrh.mp4 -r 0.1 -ss 00:00:5 -f image2 img/images%02d.png
////ffmpeg -i superstunt_8uiarzrh.mp4 -r 0.05 -ss 00:00:5 -f image2 img/images%1d.jpg
// executes the command
$command = "$tnail $options";
ob_start();
passthru($command." 2>&1", $tnail_return);
$tnail_output = ob_get_contents();
ob_end_clean();
if (!file_exists($thumbfile)) {
$error_param = array(
'%file' => $thumbfile,
'%cmd' => $command,
'%out' => $tnail_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);
// let's log this
watchdog('video_ffmpeg',$error_msg, array(), WATCHDOG_ERROR);
}
}
// Begin building file object.
//TODO : use file_munge_filename()
$file = new stdClass();
$file->uid = $user->uid;
$file->status = FILE_STATUS_TEMPORARY;
$file->filename = trim("video-thumb-for-$fid-$i.png");
$file->filepath = $thumbfile;
$file->filemime = file_get_mimetype("video-thumb-for-$fid-$i.png");
$file->filesize = filesize($thumbfile);
$file->timestamp = time();
$files[] = $file;
}
return $files;
}
/**
* Implementing hook_chcek_exepath() on inc
* To check the the path is executable or not
* @param <type> path to check
* @return bool TRUE/FALSE
*/
function ffmpeg_check_exe_path($path=NULL) {
if (!$path) {
$path = variable_get('video_transcoder_path', '/usr/bin/ffmpeg');
}
if (function_exists('is_executable')) {
$test = 'is_executable';
} else {
$test = 'file_exists';
}
return $test($path);
}
/**
* Implementing hook_auto_convert();
* @param <type> $job
*/
function ffmpeg_auto_convert(&$job) {
$videofile = escapeshellarg($job->filepath); // escape file name for safety
$convfile = tempnam(file_directory_temp(), 'video-rendering');
$audiobitrate = variable_get('video_ffmpeg_helper_auto_cvr_audio_bitrate', 64);
$videobitrate = variable_get('video_ffmpeg_helper_auto_cvr_video_bitrate', 200);
$size = _video_render_get_size();
$converter = variable_get('video_transcoder_path', '/usr/bin/ffmpeg');
$options = preg_replace(array('/%videofile/', '/%convertfile/', '/%audiobitrate/', '/%size/', '/%videobitrate/'),
array($videofile, $convfile, $audiobitrate, $size, $videobitrate),
variable_get('video_ffmpeg_helper_auto_cvr_options',
'-y -i %videofile -f flv -ar 22050 -ab %audiobitrate -s %size -b %videobitrate -qscale 1 %convertfile'));
// set to the converted file output
$job->convfile = $convfile;
$command = VIDEO_RENDERING_NICE . " $converter $options";
//print('executing ' . $command); die;
watchdog('video_render', 'executing: ' . $command, array(), WATCHDOG_DEBUG);
// watchdog('video_render', 'Starting : ' . time());
//execute the command
ob_start();
passthru($command." 2>&1", $command_return);
$command_output = ob_get_contents();
ob_end_clean();
// watchdog('video_render', 'Completed');
//print $command_output;
if (!file_exists($job->convfile) || !filesize($job->convfile)) {
watchdog('video_render', 'video conversion failed. ffmpeg reported the following output: ' . $command_output, array(), WATCHDOG_ERROR);
// _video_render_set_video_encoded_fid($job->nid, $job->vid, -1);
// _video_render_job_change_status($job->nid, $job->vid, VIDEO_RENDERING_FAILED);
}
else {
$file_name = basename($job->filename . ".flv");
$file = new stdClass();
$file->uid = $job->uid;
$file->status = FILE_STATUS_PERMANENT;
$file->filename = basename($file_name);
$file->filepath = $job->convfile;
$file->filemime = file_get_mimetype($file_name);
$file->filesize = filesize($job->convfile);
$file->timestamp = time();
$job->converted = $file;
}
}
?>