Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

Moderators: martimiz, UncleCheese, Sean, biapar, Willr, Ingo, swaiba

How to use video thumbnail image.


Go to End
Reply


837 Views

Avatar
cherry

Community Member, 5 Posts

29 November 2011 at 10:40pm

Hi

In my flv.php default image was created. but i want to use video thumbnail image.

this is my flv.php

<?php

class FLV extends File
{
public static $allowed_file_types = array(
'flv','avi','mov','mpeg','mpg','m4a'
);

private static $has_ffmpeg = null;
private $allow_full_screen = true;
private static $ffmpeg_root = "";
private static $termination_code;
public static $player_count = 0;
public static $video_width = 840;
public static $video_height = 525;
public static $default_thumbnail_width = 640;
public static $default_thumbnail_height = 480;
public static $thumbnail_folder = "video_thumbnails";
public static $log_file_path = "dataobject_manager/code/flv/ffmpeg_log.txt";
public static $default_popup_width = 840;
public static $default_popup_height = 525;

public static $thumbnail_seconds = 10;
public static $audio_sampling_rate = 22050;
public static $audio_bit_rate = 32;
public static $play_button_overlay = true;
// .gif is also available to support the IE6 world, or specify your own.
public static $default_video_icon_path = "dataobject_manager/code/flv/images/video_image.jpeg";

// $default_video_icon_path=$VideoPage->Image();

public static function set_ffmpeg_root($path)
{
if(substr($path,-1)!="/") $path .= "/";
self::$ffmpeg_root = $path;
}

public static function has_ffmpeg()
{
// Cache this so we don't have to run a shell command every time.
if(self::$has_ffmpeg !== null) return self::$has_ffmpeg;

$success = false;
if(extension_loaded('ffmpeg'))
$success = true;
else {
$output = self::ffmpeg("");
if(self::$termination_code == 1) $success = true;
}
self::$has_ffmpeg = $success;
return self::$has_ffmpeg;
}

public static function echo_ffmpeg_test()
{

echo self::has_ffmpeg() ? "<span style='color:green'>FFMPEG is installed on your server and working properly. Code: ".self::$termination_code."</span>" :
"<span class='color:red'>FFMPEG does not appear to be installed on your server. Code: ".self::$termination_code."</span>";
}

protected static function ffmpeg($args)
{
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a file to write to
);

$pipes= array();
$cmd = self::$ffmpeg_root."ffmpeg ".$args;
self::log_command($cmd);
$process = proc_open($cmd, $descriptorspec, $pipes);

$output= "";

if (!is_resource($process)) return false;

#close child's input immediately
fclose($pipes[0]);

stream_set_blocking($pipes[1],false);
stream_set_blocking($pipes[2],false);

$todo= array($pipes[1],$pipes[2]);

while( true ) {
$read= array();
if( !feof($pipes[1]) ) $read[]= $pipes[1];
if( !feof($pipes[2]) ) $read[]= $pipes[2];

if (!$read) break;

$ready= stream_select($read, $write=NULL, $ex= NULL, 2);

if ($ready === false) {
break; #should never happen - something died
}

foreach ($read as $r) {
$s= fread($r,1024);
$output.= $s;
}
}

fclose($pipes[1]);
fclose($pipes[2]);

self::$termination_code = proc_close($process);
self::log_command($output);
return $output;

}

private static function log_command($cmd)
{
if(self::$log_file_path) {
$log = Director::baseFolder()."/".self::$log_file_path;
$f = @fopen($log, 'a');
$entry = "[".date('Y-m-d H:i:s')."] ".$cmd."\n";
@fwrite($f, $entry);
@fclose($f);
}
}

private function default_thumbnail()
{
$img = new Image_Cached(self::$default_video_icon_path);
$img->ID = $this->ID;
return $img;
}

private function SWFLink()
{
return Director::absoluteURL('dataobject_manager/code/flv/shadowbox/libraries/mediaplayer/player.swf');
}

private function AllowFullScreen()
{
return $this->allow_full_screen ? "true" : "false";
}

private static function remove_file_extension($filename)
{
$ext = strrchr($filename, '.');
if($ext !== false)
$filename = substr($filename, 0, -strlen($ext));
return $filename;
}

private static function clean_file($str)
{
$t = strtolower($str);
$t = str_replace('&amp;','-and-',$t);
$t = str_replace('&','-and-',$t);
$t = ereg_replace('[^A-Za-z0-9]+','-',$t);
$t = ereg_replace('-+','-',$t);
return $t;
}

public function Icon()
{
return SAPPHIRE_DIR."/images/app_icons/mov_32.gif";
}

public function FLVPath()
{
return self::remove_file_extension($this->Filename).".flv";
}

public function FLVLink()
{
return Director::absoluteURL($this->FLVPath());
}

private function absoluteRawVideoLink()
{
return Director::baseFolder()."/".$this->Filename;
}

private function absoluteFLVPath()
{
return Director::baseFolder()."/".$this->FLVPath();
}

private function hasFLV()
{
return Director::fileExists($this->FLVPath());
}

public function getThumbnail()
{
if($img = DataObject::get_one("Image","Title = 'flv_thumb_{$this->ID}'"))
return Director::fileExists($img->Filename) ? $img : false;
return false;
}

private function createFLV()
{
$args = sprintf("-i %s -ar %d -ab %d -f flv %s",
$this->absoluteRawVideoLink(),
self::$audio_sampling_rate,
self::$audio_bit_rate,
$this->absoluteFLVPath()
);

$output = self::ffmpeg($args);
}

private function createThumbnail()
{
$img_title = "flv_thumb_".$this->ID;
if($existing = DataObject::get("Image","Title = '$img_title'")) {
foreach($existing as $file) $file->delete();
}
$folder = Folder::findOrMake(self::$thumbnail_folder);
$img_filename = self::clean_file(self::remove_file_extension($this->Title)).".jpg";
$abs_thumb = Director::baseFolder()."/".$folder->Filename.$img_filename;
$args = sprintf("-y -i %s -an -s %s -ss %d -an -r 1 -vframes 1 -y -vcodec mjpeg -f mjpeg %s",
$this->absoluteFLVPath(),
self::$default_thumbnail_width."x".self::$default_thumbnail_height,
self::$thumbnail_seconds,
$abs_thumb
);
self::ffmpeg($args);

$img = new Image();
$img->setField('ParentID',$folder->ID);
$img->Filename = $folder->Filename.$img_filename;
$img->Title = $img_title;
$img->write();
}

public function onBeforeWrite()
{
parent::onBeforeWrite();
if(!$this->hasFLV())
$this->createFLV();
if(!$this->getThumbnail())
$this->createThumbnail();
}

public function Player($width = null, $height = null)
{
if($width === null) $width = self::$video_width;
if($height === null) $height = self::$video_height;
$image = ($thumb = $this->VideoThumbnail()) ? $thumb->URL : "";
self::$player_count++;
Requirements::javascript('dataobject_manager/code/flv/swfobject.js');
Requirements::javascript('dataobject_manager/code/flv/shadowbox/shadowbox.js');
Requirements::css('dataobject_manager/code/flv/shadowbox/shadowbox.css');
Requirements::customScript(sprintf(
"swfobject.embedSWF('%s','player-%s','%d','%d','9.0.0','expressInstall.swf',{file : '%s',image : '%s'},{allowscriptaccess : 'true', allowfullscreen : '%s'})",
$this->SWFLink(),
self::$player_count,
$width,
$height,
$this->FLVLink(),
$image,
$this->AllowFullScreen()
)
);
return "<div id='player-".self::$player_count."'>Loading...</div>";
}

public function forTemplate()
{
return $this->Player();
}

public function VideoThumbnail()
{
if(self::has_ffmpeg() && !$img = $this->getThumbnail())
$this->createThumbnail();
$img = $this->getThumbnail();
return $img ? $img : $this->getThumbnail();

}

/**
* SSViewer doesn't accept more than two arguments for template
* functions. Here's a hack. If an arg is, e.g. 200x400 it will
* split that into width/height for thumb for first arg, and popup
* for second arg.
*
* Examples:
* $VideoPopup(450,200) : Returns a video popup with thumbnail
* 450 width, 200 height. Popup is default dimensions
*
* $VideoPopup(450x200,800x600) : Returns a video popup with thumbnail
* 450 width, 200 height. Popup is 800 width, 600 height.
*
* $VideoPopup(450x200) : Same as first example.
*
*/
public function VideoPopup($arg1 = null, $arg2 = null)
{
$popup_width = null;
$popup_height = null;
if($arg1 !== null && stristr($arg1,"x"))
list($thumb_width,$thumb_height) = explode("x",$arg1);
else
$thumb_width = $arg1;

if($arg2 !== null && stristr($arg2,"x"))
list($popup_width,$popup_height) = explode("x",$arg2);
else
$thumb_height = $arg2;

if($popup_width === null) $popup_width = self::$default_popup_width;
if($popup_height === null) $popup_height = self::$default_popup_height;

return $this->customise(array(
'PopupWidth' => $popup_width,
'PopupHeight' => $popup_height,
'ThumbWidth' => $thumb_width,
'ThumbHeight' => $thumb_height,
'Title' => $this->Title,
'Link' => $this->FLVLink(),
'Thumbnail' => $this->VideoThumbnail()->CroppedImage($thumb_width, $thumb_height),
'PlayButton' => self::$play_button_overlay
))->renderWith(array('FLVpopup'));

}
}