php 操作 ffmpeg類

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.avi‪D:\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;
    }
}

?>

花了不少時間寫的,拿走請點贊,多謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章