2013-09-24 15:12:51  浏览:1884

cakephp FFmpeg

利用ffmpeg和ffmpeg-php,获取视频的截图和播放时长,或者音频的播放时长,并把代码整合到cakephpzhong

ffmpeg

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

使用条件

PHP 5.3 and higher

ffmpeg or ffprobe


首先,安装ffmpeg,


到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 );
获取到视频/音频的播放时长,或者视频的第一帧截图.



返回首页