各位好:
想請教我想用FFMpeg來對影片作轉檔跟截圖
我的電腦:win 10 64 位元
我有抓PHP_FFMpeg.dll,放在C:\xampp\php\ext
再到CMD 下指令:composer require php-ffmpeg/php-ffmpeg
但他一直出現:
但是我找不到其他的dll檔了....
有大大能提供給我載點嗎?謝謝
以下是我抄官網了sample code:
<?php
require '../../vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('video.mpg');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
->save('frame.jpg');
?>
顯示錯誤:
Fatal error: Uncaught Alchemy\BinaryDriver\Exception\ExecutableNotFoundException: Executable not found, proposed : avprobe, ffprobe in C:\vendor\alchemy\binary-driver\src\Alchemy\BinaryDriver\AbstractBinary.php:159 Stack trace: #0 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Driver\FFProbeDriver.php(48): Alchemy\BinaryDriver\AbstractBinary::load(Array, NULL, Object(Alchemy\BinaryDriver\Configuration)) #1 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFProbe.php(226): FFMpeg\Driver\FFProbeDriver::create(Object(Alchemy\BinaryDriver\Configuration), NULL) #2 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFMpeg.php(132): FFMpeg\FFProbe::create(Array, NULL, Object(Doctrine\Common\Cache\ArrayCache)) #3 C:\xampp\htdocs\video.php(4): FFMpeg\FFMpeg::create() #4 {main} Next FFMpeg\Exception\ExecutableNotFoundException: Unable to load FFProbe in C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Driver\FFProbeDriver.php:50 Stack trace: #0 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFProbe.php(226): FFMpeg\Driver\FFProbeDriver::create(Object(Alchemy in C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Driver\FFProbeDriver.php on line 50
想請教各位該怎麼設定才行
謝謝大家~
剛剛看了一下官網的說明,他只有要求電腦有 ffmpeg 的執行檔
所以 ffmpeg 並不需要作為 php extension
我測試官網的範例是可行的,以下修改自 Basic Usage
<?php
require 'vendor/autoload.php';
//指定 ffmpeg 執行檔路徑
$ffmpeg = FFMpeg\FFMpeg::create([
'ffmpeg.binaries'=>'d:\ffmpeg\bin\ffmpeg.exe',
'ffprobe.binaries' => 'd:\ffmpeg\bin\ffprobe.exe',
]);
$video = $ffmpeg->open('SampleVideo_1280x720_5mb.mp4');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
->save('frame.jpg');
//匯出 WebM 格式
$video->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
直接從官網抓編譯好的壓縮檔,解壓縮就可。
裡面可以找到 bin 資料夾,內有 ffmpeg.exe 跟 ffprobe.exe
PS. php.ini 那邊不需要用到 ffmpeg 的 extension,記得刪除相關設定。
範例中共匯出 x264、wmv、webm 幾種格式
目前測試只有 webm 可行
另外兩種輸出的錯誤如下
格式 | 錯誤訊息 | 原因 |
---|---|---|
x264 | Unknown encoder 'libfaac' | ffmpeg 官方編譯版本預設不包含 libfaac,這可以自行編譯 ffmpeg 解決 |
wmv | too many channels: got 6, need 2 or fewer. Error initializing output stream 0:1 -- Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height | 待研究,有點像是套件內部給的參數錯誤 |
這個套件內部其實只是用命令列的方式使用 ffmpeg
自己 diy 直接執行 ffmpeg 應該也可以
不過如果有用到使用者的參數要做好過濾
感謝大大
但目前我放了ffmpeg.exe和ffprobe.exe
也刪除PHP.ini設定,卻還是出現以下錯誤
努力中~~
Fatal error: Uncaught Alchemy\BinaryDriver\Exception\ExecutionFailureException: ffprobe failed to execute command C:\ffmpeg\bin\ffprobe.exe -help -loglevel quiet: Error Output: in C:\vendor\alchemy\binary-driver\src\Alchemy\BinaryDriver\ProcessRunner.php:95 Stack trace: #0 C:\vendor\alchemy\binary-driver\src\Alchemy\BinaryDriver\ProcessRunner.php(73): Alchemy\BinaryDriver\ProcessRunner->doExecutionFailure('C:\\ffmpeg\\bin\\f...', '') #1 C:\vendor\alchemy\binary-driver\src\Alchemy\BinaryDriver\AbstractBinary.php(207): Alchemy\BinaryDriver\ProcessRunner->run(Object(Symfony\Component\Process\Process), Object(SplObjectStorage), false) #2 C:\vendor\alchemy\binary-driver\src\Alchemy\BinaryDriver\AbstractBinary.php(136): Alchemy\BinaryDriver\AbstractBinary->run(Object(Symfony\Component\Process\Process), false, NULL) #3 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFProbe\OptionsTester.php(61): Alchemy\BinaryDriver\AbstractBinary->command(Array) #4 C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFProbe\OptionsTester.php(43): FFMpeg in C:\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\FFProbe\OptionsTester.php on line 63
在命令列直接執行 C:\ffmpeg\bin\ffprobe.exe -help -loglevel quiet
看看會產生甚麼錯誤。
謝謝大大,在別台電腦就好了~
先用phpinfo看看是否真的有載入。
安裝套件完,要記得重啟。
目前看起來因該是沒啟動這個套件造成的。
有時要查一下php.ini是否的有掛入這個套件。
畢竟有時命令掛入的,會因為配置上的不同,而掛入錯不同的設定檔。
星空大大好:
phpinfo真的沒載入....
但我再php.ini中已加入
extension=php_ffmpeg.dll
而且Apache也重開好幾次了.....
想請教大大有沒有甚麼方法呢?謝謝
是有個不太建議的招。
正常會發生這樣的事,大多都是設定的指向路徑錯誤。
如你的ext指向路徑位置得先確定是指向去哪。
但其實還是有個爛招。window系統獨有的。
可以試著將dll copy到windows/system32這邊試試。
有時可以讀到。
不過我先說,這招算是很不好。最好還是確保你的ext位置在哪。用正規的方式來處理。
可以查一下你的php的log。有時可能並不是沒載入到。有機會可能是版本問題。但這要從log中查看才能知道原因。
真的要放到 windows/system32 之前
可以先試試看放到 apache/bin
This library requires a working FFMpeg install. You will need both FFMpeg and FFProbe binaries to use it.
Be sure that these binaries can be located with system PATH to get the benefit of the binary detection
問一下,你有沒有到FFmpeg.org下載和安裝 FFMpeg & FFProbe
沒有的話先到官網下載windows版的ffmpeg,有可能是在系統抓不到這兩個binary造成錯誤:
https://ffmpeg.org/download.html
Git文件上寫的網站已經關閉了
https://www.reddit.com/r/youtubedl/comments/ikmtb5/ffmpegzeranoecom_official_ffmpeg_builds_for/
其實,我剛剛點開你第一張圖。突然發現到一個問題點。
你有沒有注意到,它的錯誤訊息是找不到 php_ffmpeg.dll.dll
多了一個dll。
搞不好這就是你的問題了。
我的做法是寫個python去跑ffmpeg下載串流資料並存檔,讓php去呼叫這個.py,執行完畢後再print值回傳給php,再回php把檔案丟給瀏覽器下載.....
至於php-ffmpeg,我沒裝也不想裝,不知有沒有在維護更新
$songname = exec("/home/xxxxxx/code/getsong.py '" . $songname . "' ");
if(file_exists($songname))
{
$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";
ob_start();
header('Content-Disposition: attachment ;filename="' . urlencode(getBrifname($songname)) . '.mp3"');
header('Content-type: {$mime_type}');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
header('Expires: 0');
header('Content-Length: ' . filesize($songname));
readfile($songname);
ob_end_flush();
}