利用ffmpeg和ffmpeg-php,获取视频的截图和播放时长,或者音频的播放时长,并把代码整合到cakephpzhong
ffmpeg
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
使用条件
PHP 5.3 and higher
ffmpeg or ffprobe
到ffmpeg的官网http://ffmpeg.org/download.html 下载适合的版本
然后照着网上的资料,一步步安装,最后在命令行中,输入ffmpeg 出现如下效果,证明ffmpeg库安装成功。
然后再下载ffmpeg-php
FFmpegPHP 是一个纯面向对象的 ffmpeg 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息,可直接从视频中获取帧的图片,这常用来做视频的缩略图。支持的视频格式包 括: MOV, AVI, MPG, 和 WMV.
FFmpegPHP封装,没有提供视频转换的接口
下载地址:https://github.com/CodeScaleInc/ffmpeg-php
可以简单的测试一下:
getDuration()." " . "getFrameCount: " . $ffmpegInstance->getFrameCount()." " . "getFrameRate: " . $ffmpegInstance->getFrameRate()." " . "getFilename: " . $ffmpegInstance->getFilename()." " . "getComment: " . $ffmpegInstance->getComment()." " . "getTitle: " . $ffmpegInstance->getTitle()." " . "getAuthor: " . $ffmpegInstance->getAuthor()." " . "getCopyright: " . $ffmpegInstance->getCopyright()." " . "getArtist: " . $ffmpegInstance->getArtist()." " . "getGenre: " . $ffmpegInstance->getGenre()." " . "getTrackNumber: " . $ffmpegInstance->getTrackNumber()." " . "getYear: " . $ffmpegInstance->getYear()." " . "getFrameHeight: " . $ffmpegInstance->getFrameHeight()." " . "getFrameWidth: " . $ffmpegInstance->getFrameWidth()." " . "getPixelFormat: " . $ffmpegInstance->getPixelFormat()." " . "getBitRate: " . $ffmpegInstance->getBitRate()." " . "getVideoBitRate: " . $ffmpegInstance->getVideoBitRate()." " . "getAudioBitRate: " . $ffmpegInstance->getAudioBitRate()." " . "getAudioSampleRate: " . $ffmpegInstance->getAudioSampleRate()." " . "getVideoCodec: " . $ffmpegInstance->getVideoCodec()." " . "getAudioCodec: " . $ffmpegInstance->getAudioCodec()." " . "getAudioChannels: " . $ffmpegInstance->getAudioChannels()." " . "hasAudio: " . $ffmpegInstance->hasAudio(); //下面是获取截图 $move_width=$ffmpegInstance->getFrameWidth(); $move_height=$ffmpegInstance->getFrameHeight(); $out_move_height=$move_height*200/$move_width; $ff_frame = $ffmpegInstance->getFrame(1,200,$out_move_height);//截取视频第1帧的图像 $gd_image = $ff_frame->toGDImage(); $img=$_SERVER['DOCUMENT_ROOT']."/test2.jpg";//要生成图片的绝对路径 imagejpeg($gd_image, $img);//创建jpg图像 imagedestroy($gd_image);//销毁一图像
如果上面的代码测试成功,则可以整合到cakephp中啦
先在cakephp的vendors中,新建一个文件夹ffmpeg
复制ffmpeg-php下载的所有文件到这个文件夹下面
再在appControllerComponent下新建一个FFmpegComponent.php
代码如下;
FFmpegMovie = new FFmpegMovie ( $this->filePath ); } catch (Exception $e) { $this->log ( "初始化FFmpegMovie失败:" . $e->getMessage(), "ffmpeg" ); } } /** * 获取视频的播放时长和截图,如果是音频,则只获取播放时长 * * @param $path 文件存放绝对地址 * @param $relativePath 文件相对地址 */ public function getMoveInfo($path, $relativePath = "") { if (empty ( $path )) { return false; } $this->filePath = $path; $this->initMove (); $duration = "0"; $thumb = ""; // 如果有音频 if ($this->hasAudio ()) { $duration = $this->getDuration (); } // 如果是视频 if ($this->hasVideo ()) { if (empty ( $relativePath )) { return $data; } $duration = $this->getDuration (); // 生成一个地址 $this->thumbRelativeAddress = $this->buildPath ( $relativePath ); $this->thumbAbsoluteAddress = $this->buildPath ( $path ); if ($this->getMoveThumb ( $this->thumbAbsoluteAddress )) { $thumb = $this->thumbRelativeAddress; } } $data = array ( "duration" => $duration, "thumb" => $thumb ); return $data; } /** * 构造新地址,同时带上截图后缀 * * @param $path 文件地址 */ private function buildPath($path) { $newPath = substr ( $path, 0, strripos ( $path, "." ) ) . $this->thumb_new_name; return $newPath; } /** * 获取视频音频的播放时长 */ public function getDuration() { return $this->FFmpegMovie->getDuration (); } /** * 检查是否是视频 */ public function hasVideo() { return $this->FFmpegMovie->hasVideo (); } /** * 检查是否有音频 */ public function hasAudio() { return $this->FFmpegMovie->hasAudio (); } /** * 获取影片高度 */ public function getFrameHeight() { return $this->FFmpegMovie->getFrameHeight (); } /** * 获取影片宽度 */ public function getFrameWidth() { return $this->FFmpegMovie->getFrameWidth (); } /** * 获取视频的截图 * * @param $outFilePath 要生成图片的绝对路径 * @param $maxWidth 生成图片的最大宽度 * @param $maxHeight 生成图片的最大高度 * @param $framenumber 获取第几帧的图像 * @return bool true:成功;false:失败 */ public function getMoveThumb($outFilePath, $maxWidth = 200, $maxHeight = 200, $framenumber = 1) { $f_height = $this->getFrameHeight (); $f_width = $this->getFrameWidth (); $out_move_height = 0; $out_move_width = 0; // 计算输出的最终宽度高度 if ($maxWidth / $f_width < $maxHeight / $f_height) { // 较宽的视频 if ($maxWidth > $f_width) { $out_move_width = $f_width; } else { $out_move_width = $maxWidth; } $out_move_height = intval($f_height * $out_move_width / $f_width); } else { // 较高的视频 if ($maxHeight > $f_height) { $out_move_height = $f_height; } else { $out_move_height = $maxHeight; } $out_move_width = intval($f_width * $out_move_height / $f_height); } try {//特别提醒,这里设置截取的长,宽尺寸必须为整数 $ff_frame = $this->FFmpegMovie->getFrame ( $framenumber, $out_move_width, $out_move_height ); // 截取视频第1帧的图像 $gd_image = $ff_frame->toGDImage (); imagejpeg ( $gd_image, $outFilePath ); // 创建jpg图像 imagedestroy ( $gd_image ); // 销毁一图像 } catch ( Exception $e ) { $this->log ( "getMoveThumb-->获取截图失败: ".$outFilePath." " . $this->filePath." ".$e->getMessage(), "ffmpeg" ); return false; } return true; } }
然后在其他controller或者Component中调用这个类
public $components = array (
"FFmpeg"
);
$movieinfo = $this->FFmpeg->getMoveInfo ( $fileFullPath, $file_url );
获取到视频/音频的播放时长,或者视频的第一帧截图.