php 操作 ffmpeg类
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2023-10-06 12:50:58
php ffmpeg类实现功能:
视频剪切,视频压缩,格式转换,视频加水印,视频加文字,获取视频长度、大小、格式、分辨率、码率等信息,注意在视频加文字的时候文字不要有标点符号,还有字体在windows里面的font文件夹有,传入文字需要的字体!
环境需要:
1.php 开启exec函数
2.ffmpeg配置环境变量或者软连接到/usr/bin/
3.如果需要上传大文件的nginx配置文件在http字段加上:client_max_body_size 1000m;
4.php.ini文件开启:
file_uploads = on ;//是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir ;//文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 1024m ;//望文生意,即允许上传文件大小的最大值。默认为2M,我们设置为1G
post_max_size = 1024m ;//指通过表单POST给PHP的所能接收的最大值,我们也设置为1G
max_execution_time = 3600 ;//每个PHP页面运行的最大时间值(秒),默认30秒,设置为一小时,因为后面转码时间很久。
max_input_time = 600;//每个PHP页面接收数据所需的最大时间,默认600秒
memory_limit = 2048m ;//每个PHP页面所吃掉的最大内存,默认8M
<?php
/**
* video class
* written: denny Date :2020-06-15
*/
class Mpeg{
public $sowarePath = "";
public $ffmpegCmd = "ffmpeg ";
public $ffprobeCmd = "ffprobe ";
function __construct($sowarePath=''){
if (!function_exists('exec')){
echo "exec function not exist!";return;
}
if($sowarePath){
$this->sowarePath = $sowarePath;
}
}
/**
* 视频加文字
* $position = win10不支持中文字体,请添加英文或数组字体,标点符号也不能有
* $xOffset x坐标的偏移量,$yOffset x坐标的偏移量
* ffmpeg -i source.mp4 -vf drawtext=fontcolor=white:fontsize=60:fontfile=arial.ttf:text="hei guy":x=main_w/2-30:y=main_h/2-30:enable='between(t\,2\,6)' out.mp4
*/
function FontVideo($sourceFile='',$outPutFile='',$string="",$fontFile="",$fontSize=60,$fontColor="red",$xOffset=30,$yOffset=30,$startSecond=0,$endSecond=10){
if (!file_exists($sourceFile)||!is_file($fontFile)){
return false;//"file not exist!";
}
if(!$endSecond){
return false;
}
$fontFile = $fontFile?$fontFile:$this->sowarePath.'simyou.ttf';
$Symbol = array(
'"','“',',',",",'!','!','@','#','$','%','^','&','*','(','(',')',')','+','-','—','>','》',
'<','《','.','。','?','?','/','、','`','·','-',
);
$string = str_replace($Symbol," ",$string);
$outPut = $returnVar = "";
$position = "x=$xOffset:y=$yOffset";
exec($this->sowarePath . "ffmpeg -i $sourceFile -vf drawtext=fontcolor=$fontColor:fontsize=$fontSize:fontfile=$fontFile:text=\"$string\":$position:enable='between(t\,{$startSecond}\,{$endSecond})' $outPutFile",$outPut,$returnVar);
if($returnVar==1){
return false;//命令执行失败
}else{
return $outPutFile;//命令执行成功,返回路径
}
}
/**
* 视频加水印 $file = D:/source.mp4,$outPutFile=d:/compression.mp4
* $position = (leftTop,rightTop,leftBottom,rightBottom,middle);左上角,右上角,左下角,右下角
* $xOffset x坐标的偏移量,$yOffset x坐标的偏移量
* ffmpeg -i E:\ffmpeg\bin\source_cut_zip.mp4 -i E:\ffmpeg\bin\logo.png -filter_complex "overlay=30:30" E:\ffmpeg\bin\source_cut_zip_logo.mp4
*/
function WaterVideo($sourceFile='',$outPutFile='',$logoFile="",$position="leftTop",$xOffset=30,$yOffset=30){
if (!file_exists($sourceFile)||!is_file($logoFile)){
return false;//"file not exist!";
}
$outPut = $returnVar = "";
switch($position){
case 'leftTop':
$position = "$xOffset:$yOffset";break;
case 'rightTop':
$position = "main_w-overlay_w-$xOffset:$yOffset";break;
case 'leftBottom':
$position = "$xOffset:main_h-overlay_h-$yOffset";break;
case 'rightBottom':
$position = "main_w-overlay_w-$xOffset:main_h-overlay_h-$yOffset";break;
case 'middle':
$position = "overlay=main_w/2-overlay_w/2:main_h/2-overlay_h/2";break;
default:
$position = "$xOffset:$yOffset";
}
$H264 = PHP_OS!='WINNT'?" -vcodec libx264 ":' ';
exec($this->sowarePath . "ffmpeg -i $sourceFile -i $logoFile -filter_complex \"overlay=$position\" $H264 $outPutFile",$outPut,$returnVar);
if($returnVar==1){
return false;//命令执行失败
}else{
return $outPutFile;//命令执行成功,返回路径
}
}
/**
* 视频裁剪 $file = D:/source.mp4,$outPutFile=d:/compression.mp4
* ffmpeg -ss 00:00:00 -t 00:01:05 -i E:\ffmpeg\bin\source.mp4 -vcodec copy -acodec copy E:\ffmpeg\bin\source_cut.mp4
*/
function CutVideo($sourceFile='',$outPutFile='',$startCut='00:00:00',$cutLen='00:01:00'){
if (!file_exists($sourceFile)){
return false;//"file not exist!";
}
$outPut = $returnVar = "";
$start = $startCut?trim($startCut):$startCut;
$videoLen = $cutLen?trim($cutLen):$cutLen;
exec($this->sowarePath . "ffmpeg -ss $start -t $videoLen -i $sourceFile -vcodec copy -acodec copy $outPutFile",$outPut,$returnVar);
if($returnVar==1){
return false;//命令执行失败
}else{
return $outPutFile;//命令执行成功,返回路径
}
}
/**
* 视频压缩 $file = D:\source.mp4,$outPutFile=d:/compression.mp4,$rate码率,网页一般800-1200就ok,$maxRate默认$rate+200
*/
function VideoCompression($sourceFile='',$outPutFile='',$width=1280,$height=720,$rate=800,$maxRate=1000){
if (!file_exists($sourceFile)){
return false;//"file not exist!";
}
$outPut=$returnVar = "";
$width = intval($width);
$rate = intval($rate);
$maxRate = intval($maxRate)>0?$maxRate:$rate+200;
$H264 = PHP_OS!='WINNT'?" -vcodec libx264 ":' ';
exec($this->sowarePath . "ffmpeg -i $sourceFile -vf scale=$width:$height -b:v {$rate}k -bufsize {$rate}k -maxrate {$maxRate}k $H264 $outPutFile",$outPut,$returnVar);
if($returnVar==1){
return false;//命令执行失败
}else{
return $outPutFile;//命令执行成功,返回路径
}
}
/**
* 视频格式转换 $file = D:\jd.mp4,$outPutFile=d:/conversion.aviD:\m3c.sql
*/
function formatConversion($file='',$outPutFile=''){
if (!file_exists($file)) {
return false;//"file not exist!";
}
$outPut=$returnVar = "";
exec($this->sowarePath . "ffmpeg -i $file $outPutFile",$outPut,$returnVar);
if($returnVar==1){
return false;//命令执行失败
}else{
return $outPutFile;//命令执行成功,返回路径
}
}
/**
* 视频提取音频 D:\jd.mp4
*/
function ExtractSound($file='',$outPutMp3=''){
if (!is_file($file)) {
return false;//"file not exist!";
}
passthru($this->sowarePath . "ffprobe -v quiet -show_format -show_streams -print_format json " . $file);
$video_info = ob_get_contents();
ob_end_clean();
$result = json_decode($video_info, true);
}
/**
* ffmpeg获取视频信息 written:Denny Yang
* */
function VideoInfo($file=''){
if(!is_file($file)){
return false;//"file not exist!";
}
ob_start();
passthru($this->sowarePath."ffprobe -v quiet -show_format -show_streams -print_format json ".$file);
$video_info = ob_get_contents();
ob_end_clean();
$result = json_decode($video_info,true);
$ret['width'] = isset($result['streams'][0]['width'])?$result['streams'][0]['width']:0;//宽度
$ret['height'] = isset($result['streams'][0]['height'])?$result['streams'][0]['height']:0;//高度
$ret['sample_aspect_ratio'] = isset($result['streams'][0]['sample_aspect_ratio'])?$result['streams'][0]['sample_aspect_ratio']:0;//比例
$ret['display_aspect_ratio']= isset($result['streams'][0]['display_aspect_ratio'])?$result['streams'][0]['display_aspect_ratio']:0;
$ret['r_frame_rate'] = isset($result['streams'][0]['r_frame_rate'])?$result['streams'][0]['r_frame_rate']:0;//帧数
$ret['avg_frame_rate'] = isset($result['streams'][0]['avg_frame_rate'])?$result['streams'][0]['avg_frame_rate']:0;//平均帧数
$ret['video_duration'] = isset($result['streams'][0]['duration'])?$result['streams'][0]['duration']:0;//视频时长
$ret['video_bit_rate'] = isset($result['streams'][0]['bit_rate'])?$result['streams'][0]['bit_rate']:0;//视频码率
$ret['audio_bit_rate'] = isset($result['streams'][1]['bit_rate'])?$result['streams'][1]['bit_rate']:0;//声音码率,jd商品5-600kbps
$ret['filename'] = isset($result['format']['filename'])?$result['format']['filename']:0;//文件名称
$ret['nb_streams'] = isset($result['format']['nb_streams'])?$result['format']['nb_streams']:0;
$ret['format_name'] = isset($result['format']['format_name'])?$result['format']['format_name']:0;//格式
$ret['start_time'] = isset($result['format']['start_time'])?$result['format']['start_time']:0;//开始时间
$ret['duration'] = isset($result['format']['duration'])?$result['format']['duration']:0;//时长
$ret['size'] = isset($result['format']['size'])?$result['format']['size']:0;//文件大小k
return $ret;
}
}
?>
花了不少时间写的,拿走请点赞,多谢!!!