一個FFMPEG視訊轉換的PHP類
<?php class local_video { public $options; public $ffmpeg; public $phpcms_path; public $backup; function __construct($options,$ffmpeg,$backup=true) { $this->opti $this->options = array_filter($options) + $this->options; $this->ffmpeg=$ffmpeg; //ffmpeg路径 $this->backup=$backup; } //获取视频信息 function video_info($file) { ob_start(); passthru(sprintf($this->ffmpeg . ' -i "%s" 2>&1', $file));//ffmpeg -i test.avi 2>&1 $info = ob_get_contents(); ob_end_clean(); // 通过使用输出缓冲,获取到ffmpeg所有输出的内容。 $ret = array(); // Duration: 01:24:12.73, start: 0.000000, bitrate: 456 kb/s if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/",$info, $match)) { $ret['duration'] = $match[1]; // 提取出播放时间 $da = explode(':', $match[1]); $ret['seconds'] = $da[0] * 3600 + $da[1] * 60 + $da[2]; // 转换为秒 $ret['start'] = $match[2]; // 开始时间 $ret['bitrate'] = $match[3]; // bitrate 码率 单位 kb } // Stream #0.1: Video: rv40, yuv420p, 512x384, 355 kb/s, 12.05 fps, 12 tbr, 1k tbn, 12 tbc if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) { $ret['vcodec'] = $match[1]; // 编码格式 $ret['vformat'] = $match[2]; // 视频格式 $ret['resolution'] = $match[3]; // 分辨率 $a = explode('x', $match[3]); $ret['width'] = $a[0]; $ret['height'] = $a[1]; } // Stream #0.0: Audio: cook, 44100 Hz, stereo, s16, 96 kb/s if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) { $ret['acodec'] = $match[1]; // 音频编码 $ret['asamplerate'] = $match[2]; // 音频采样频率 } if (isset($ret['seconds']) && isset($ret['start'])) { $ret['play_time'] = $ret['seconds'] + $ret['start']; // 实际播放时间 } $ret['size'] = filesize($file); // 文件大小 return $ret; } function convert() { $verifyToken = md5('unique_salt' . $this->options['timestamp']); if ($verifyToken == $this->options['token']) { $orgFile = $this->options['org_path'] . $this->options['org']; $setting=' '; if(isset($this->options['video_size'])) $setting=$setting.'-vf scale="'.$this->options['video_size'].'"'; $mp4 = $this->ffmpeg . ' -i ' . $orgFile . ' -ss 00:01:02 -vcodec libx264 -strict -2 '.$setting.' ' . $this->options['mp4_path_temp'] . $this->options['org'] . ''; //转换视频 exec($mp4); if(isset($this->options['watermark'])){ $watermark=' "'.$this->options['watermark'].'" '; $mp4 = $this->ffmpeg.' -i '.$this->options['mp4_path_temp'] . $this->options['org'] . ''.' -vf '.$watermark.' '.$this->options['mp4_path'] . $this->options['org'] . ''; //增加水印 exec($mp4); @unlink($this->options['mp4_path_temp'] . $this->options['org'] . ''); } $duration = $this->video_info($orgFile); $seconds = intval($duration['seconds']); $offset = intval($seconds / 21); //截图间隔 秒 $thumbs = explode(',', $this->options['thumb_size']); for ($i = 0; $i <= count($thumbs); $i++) { $targetPath = $this->options['thumb_path'] . $this->options['org'] . '/'; if (!file_exists($targetPath)) @mkdir(rtrim($targetPath, '/'), 0777); if ($i == 0) { $time = 1; $name = $i == 0 ? 'default.jpg' : $i . '.jpg'; $img_size = $this->options['main_size']; } else { $time = $i * $offset; $name = $i . '.jpg'; $img_size = $thumbs[$i-1]; } $jpg = $this->ffmpeg . ' -i ' . $orgFile . ' -f image2 -ss ' . $time . ' -vframes 1 -s ' . $img_size . ' ' . $targetPath . $name; //截图 @exec($jpg); } //复制文件到对应的FTP服务器 $ftp_server = pc_base::load_config('ftp_server'); $remote_server = $_POST['remote_server']; $ftp_server = $ftp_server[$remote_server]; if($ftp_server['ftp_server']) pc_base::ftp_upload($orgFile, $ftp_server['ftp_server'], $ftp_server['ftp_user_name'], $ftp_server['ftp_user_pass']); //备份到所有FTP服务器 if($this->backup){ $ftp_backup = pc_base::load_config('ftp_backup'); foreach ($ftp_backup as $v) { pc_base::ftp_upload( $orgFile, $ftp_backup['ftp_server'], $ftp_backup['ftp_user_name'], $ftp_backup['ftp_user_pass']); } } $result['url']=$ftp_server['ftp_server']['http_address']. $this->options['mp4_path'] . $this->options['uniqid'] . '.mp4';//记录视频播放地址 $result['uniqid']=$this->options['uniqid']; $result['videoTime'] = $this->video_info($orgFile); $result['videoTime'] = $result['videoTime']['seconds']; return $result;//返回处理结果 } else die('验证失败!'); } } ?>
參考
http://www.fieryrain.com/blog/FFMPEG_VIDEO_TIME
http://www.cnblogs.com/dwdxdy/p/3240167.html

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

1.安裝nginx2.安裝vsftpd3.修改nginx的設定檔nginx.conf 3.1首行新增ftp的用戶userftpuser; 3.2設定相關路徑server{ listen80; 站的代理伺服器的連接埠; root /home/ftpuser; #代理ftp伺服器的資料夾的絕對路徑indexftpuser; #設定歡迎頁

隨著網際網路的快速發展,檔案傳輸協定(FTP)一直是一種重要的檔案傳送方式。在Go語言中,使用FTP傳輸檔案可能是許多開發人員的需求。然而,也許很多人並不知道如何在Go語言中使用FTP。在本篇文章中,我們將探討如何在Go語言中使用FTP,從連接FTP伺服器到檔案傳輸,以及如何處理錯誤和異常。建立FTP連線在Go語言中,我們可以使用標準的"net"套件來連接FTP

PHP與FTP:在網站開發中實現多個部門的文件共享隨著互聯網的發展,越來越多的企業開始借助網站平台進行資訊發布和業務推廣。然而,隨之而來的問題是如何實現多個部門之間的文件共享和協作。在這種情況下,PHP和FTP成為了最常用的解決方案之一。本文將介紹如何利用PHP和FTP在網站開發中實現多個部門的檔案分享。一、FTP介紹FTP(FileTransferPr

WindowsServerBackup是WindowsServer作業系統自帶的功能,旨在協助使用者保護重要資料和系統配置,並為中小型和企業級企業提供完整的備份和復原解決方案。只有執行Server2022及更高版本的使用者才能使用此功能。在本文中,我們將介紹如何安裝、解除安裝或重設WindowsServerBackup。如何重置Windows伺服器備份如果您的伺服器備份遇到問題,備份所需時間過長,或無法存取已儲存的文件,那麼您可以考慮重新設定WindowsServer備份設定。要重設Windows

linux下ftp指令有:1、ftp指令;2、close指令;3、disconnect指令;4、open指令;5、user指令;6、account指令;7、bye指令;8、quit指令;9、help指令;10、rhelp命令;11、ascii命令;12、binary/bi命令;13、bell命令等。

linux ftp530的意思是linux ftp登入報錯530,其解決方法:1、查看「cat /etc/shells」是否有你使用者的主目錄和登入shell,若是沒有,則進行新增;2、檢視「/var /log/secure」文件,重新設定密碼過期時間即可。

如何用PHP實作FTP檔案上傳進度條一、背景介紹在網站開發中,檔案上傳是常見的功能。而對於大檔案的上傳,為了提高使用者體驗,我們常常需要向使用者顯示一個上傳進度條,讓使用者知道檔案上傳的進程。本文將介紹如何使用PHP實作FTP檔案上傳進度條的功能。二、FTP檔案上傳進度條的實現方法基本思路FTP檔案上傳的進度條實現,通常是透過計算上傳的檔案大小和已上傳檔案大小

如何透過PHP在FTP伺服器上進行目錄和文件的比較在web開發中,有時候我們需要比較本地文件與FTP伺服器上的文件,以確保兩者之間的一致性。 PHP提供了一些函數和類別來實作這個功能。本文將介紹如何使用PHP在FTP伺服器上進行目錄和檔案的比較,並提供相關的程式碼範例。首先,我們需要連接到FTP伺服器。 PHP提供了ftp_connect()函數來建立與FTP伺服器
