PHP調(diào)用FFMpeg實(shí)現(xiàn)音視頻操作的示例詳解
安裝PHP-FFMpeg
- 在使用 ffmpeg 之前,需要 安裝軟件 和 操作命令庫(kù)
- 軟件根據(jù)系統(tǒng),自行選擇安裝,而操作命令庫(kù)需要根據(jù)下列的命令進(jìn)行安裝
- 軟件地址:https://github.com/BtbN/FFmpeg-Builds/releases
- 命令地址:https://github.com/PHP-FFMpeg/PHP-FFMpeg/
composer require php-ffmpeg/php-ffmpeg
視頻中提取一張圖片
- 這里的
video.mp4
準(zhǔn)備的是一段宮崎駿的視頻片段 FFMpeg\FFMpeg::create
中需要指定系統(tǒng)軟件中ffmpeg
和ffprobe
的安裝位置- 通過(guò)
FFMpeg\Coordinate\TimeCode::fromSeconds
可以指定提取第幾秒的視頻作為圖片保存
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10)) ->save('image.jpg');
視頻中提取多張圖片
require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->extractMultipleFrames(FFMpeg\Filters\Video\ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, '/path/to/destination/folder/') ->synchronize(); $video ->save(new FFMpeg\Format\Video\X264(), '/path/to/new/file');
調(diào)整視頻大小
FFMpeg\Coordinate\Dimension
可以設(shè)置調(diào)整后的分辨率ResizeFilter::RESIZEMODE_FIT
是縮放模式中的一種,按照給定值進(jìn)行調(diào)整ResizeFilter::RESIZEMODE_INSET
是縮放模式中的一種,按照給定的尺寸,等比縮放,如果設(shè)置的寬高比跟原視頻不一樣,那會(huì)自動(dòng)根據(jù)寬或高進(jìn)行等比縮放ResizeFilter::RESIZEMODE_SCALE_WIDTH
是縮放模式中的一種,高按照給定值,寬進(jìn)行比例縮放ResizeFilter::RESIZEMODE_SCALE_HEIGHT
是縮放模式中的一種,寬按照給定值,高進(jìn)行比例縮放true / false
是否強(qiáng)制使用最近的縱橫比標(biāo)準(zhǔn)
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->resize(new FFMpeg\Coordinate\Dimension(160,90), FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_FIT, true); $video ->save(new FFMpeg\Format\Video\X264(), 'video_new.mp4');
視頻添加水印
- 通過(guò)
watermark
可以設(shè)置水印的相關(guān)信息,第一個(gè)參數(shù)是設(shè)置水印的地址,第二個(gè)參數(shù)里面可以設(shè)置水印位置參數(shù) position:
可以選擇relative
相對(duì)定位,或者absolute
絕對(duì)定位,如果選擇absolute
,則只需要填寫(xiě)x
和y
坐標(biāo)即可top / bottom / left / right:
四個(gè)方位上下左右距離邊緣的位置
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->watermark('watermark.png', array( 'position' => 'relative', 'bottom' => 10, 'right' => 10, )); $video->save(new FFMpeg\Format\Video\X264(), 'video_watermark_new.mp4');
生成音頻波形
- 可以看到,想要生成音頻波形,必須使用的是音頻文件,如果是視頻文件,需要先將其中的音頻提取出來(lái)
waveform:
中可以設(shè)置波形圖的長(zhǎng)寬還有波形顏色
<?php // 直接處理音頻 require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $audio = $ffmpeg->open('audio.mp3'); $waveform = $audio->waveform(640, 120, array('#00FF00')); $waveform->save('waveform.png');
<?php // 從視頻中提取音頻后再生成波形圖 require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); // Open your video file / 打開(kāi)視頻文件 $video = $ffmpeg->open( 'video.mp4' ); // Set an audio format / 設(shè)置音頻格式 $audio_format = new FFMpeg\Format\Audio\Mp3(); // Extract the audio into a new file as mp3 / 保存成 mp3 文件 $video->save($audio_format, 'audio.mp3'); // Set the audio file / 打開(kāi) mp3 文件 $audio = $ffmpeg->open( 'audio.mp3' ); // Create the waveform / 生成波形圖 $waveform = $audio->waveform(); $waveform->save( 'waveform.png' );
音頻轉(zhuǎn)換
Flac;
為無(wú)損壓縮格式setAudioChannels:
聲道設(shè)置,1單聲道,2雙聲道,3立體聲setAudioKiloBitrate:
比特率
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $audio = $ffmpeg->open('audio.mp3'); $format = new FFMpeg\Format\Audio\Flac(); $format->on('progress', function ($audio, $format, $percentage) { echo "$percentage % 進(jìn)度"; }); $format ->setAudioChannels(2) ->setAudioKiloBitrate(256); $audio->save($format, 'audio.flac');
給音頻添加元數(shù)據(jù)
支持給音頻添加標(biāo)題、藝術(shù)家、專(zhuān)輯、藝術(shù)家、作曲家、曲目、年份、描述、藝術(shù)品等
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $audio = $ffmpeg->open('audio.mp3'); $audio->filters()->addMetadata([ "title" => "this is a song title", // 標(biāo)題 "artist" => "tinygeeker", // 藝術(shù)家 "album" => "1024", // 專(zhuān)輯 "composer" => "tinygeeker", // 作曲家 "track" => 1, // 音軌 "year" => 2023, // 年份 "description" => "this is a song description", // 描述 "artwork" => "artwork.jpg" // 藝術(shù)品 ]); $audio->save(new \FFMpeg\Format\Audio\Mp3(), 'audio_new.mp3');
拼接多個(gè)音視頻
- 如果想把多個(gè)音視頻拼成一個(gè)音視頻的話(huà),可以使用
concat
命令 concat:
參數(shù)中設(shè)置想拼接的各個(gè)短視頻saveFromSameCodecs:
設(shè)置拼接后的視頻名稱(chēng),第二個(gè)參數(shù)設(shè)置為true
則允許復(fù)制參數(shù),可以加速文件的生成
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video_1.mp4'); $video ->concat(array('video_1.mp4', 'video_2.mp4', 'video_3.mp4')) ->saveFromSameCodecs('video.mp4', TRUE);
截取音視頻
TimeCode::fromSeconds:
有兩個(gè)參數(shù),第一個(gè)是從第幾秒開(kāi)始截取,第二個(gè)是截取多少秒,如果不填,則截取到最后
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30)); $video ->save(new FFMpeg\Format\Video\X264(), 'video_clip.mp4');
提取 gif 動(dòng)圖
- 使用
gif
命令可以提取視頻中的動(dòng)圖 fromSeconds
可以設(shè)置從第幾秒開(kāi)始提取,Dimension
可以設(shè)置大小和持續(xù)的時(shí)間
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->gif(FFMpeg\Coordinate\TimeCode::fromSeconds(30), new FFMpeg\Coordinate\Dimension(640, 480), 3) ->save('video.gif');
裁剪視頻
- 通過(guò)
crop
可以裁剪視頻 Dimension:
設(shè)置裁剪后的視頻尺寸Point:
指定要裁剪的點(diǎn),x
、y
坐標(biāo)和是否動(dòng)態(tài)裁剪
- 這里
x
的值是t*100
是從畫(huà)面左邊移動(dòng)到右邊這樣裁剪,值越大,移動(dòng)速度越快
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->crop(new FFMpeg\Coordinate\Point("t*100", 0, true), new FFMpeg\Coordinate\Dimension(200, 600)); $video->save(new FFMpeg\Format\Video\X264(), 'video_crop.mp4');
轉(zhuǎn)換視頻格式
setKiloBitrate:
設(shè)置視頻比特率setAudioChannels:
聲道設(shè)置,1單聲道,2雙聲道,3立體聲setAudioKiloBitrate:
設(shè)置音頻比特率
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $format = new FFMpeg\Format\Video\X264(); $format->on('progress', function ($video, $format, $percentage) { echo "$percentage % transcoded"; }); $format ->setKiloBitrate(1000) ->setAudioChannels(2) ->setAudioKiloBitrate(256); $video->save($format, 'video.avi');
調(diào)整視頻幀率
framerate:
可以設(shè)置視頻的幀速率- 大家應(yīng)該都知道,視頻其實(shí)是由一張張圖片組成的,而一秒中播放30張以上其實(shí)肉眼就會(huì)把圖片看成視頻了,這里的
30
就是所謂的幀速了,一般設(shè)置60
即可,為了測(cè)試這里設(shè)置成1000
<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); $video = $ffmpeg->open('video.mp4'); $video ->filters() ->framerate(new \FFMpeg\Coordinate\FrameRate(1000), 120); $video ->save(new FFMpeg\Format\Video\X264(), 'video_rate.mp4');
獲取音視頻信息
- 可以通過(guò)
format
獲取音視頻的所有信息 - 可以通過(guò)
get
獲取指定信息的值
<?php require 'vendor/autoload.php'; $ffprobe = FFMpeg\FFProbe::create([ 'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe', 'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe', ]); // 獲取音視頻信息 $videoInfo = $ffprobe->format('video.mp4'); // 也可以通過(guò) get 獲取指定信息的內(nèi)容,第二個(gè)參數(shù)為默認(rèn)值,如果獲取不到該信息的話(huà)返回默認(rèn)值 $duration = $ffprobe ->format('audio.mp3') ->get('duration', 100); var_dump($videoInfo); var_dump($duration);
以上就是PHP調(diào)用FFMpeg實(shí)現(xiàn)音視頻操作的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于PHP FFMpeg音視頻操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php json_encode值中大括號(hào)與花括號(hào)區(qū)別
這篇文章主要介紹了json_encode值中大括號(hào)與花括號(hào)區(qū)別,具體的看下實(shí)例說(shuō)明,需要的朋友參考下2013-09-09php采集內(nèi)容中帶有圖片地址的遠(yuǎn)程圖片并保存的方法
這篇文章主要介紹了php采集內(nèi)容中帶有圖片地址的遠(yuǎn)程圖片并保存的方法,可實(shí)現(xiàn)采集并保存遠(yuǎn)程圖片的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2015-01-01PHP函數(shù)按引用傳遞參數(shù)及函數(shù)可選參數(shù)用法示例
這篇文章主要介紹了PHP函數(shù)按引用傳遞參數(shù)及函數(shù)可選參數(shù)用法,結(jié)合實(shí)例形式分析了php函數(shù)的引用傳參與可選參數(shù)具體使用技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06php中使用array_filter()函數(shù)過(guò)濾數(shù)組實(shí)例講解
在本篇文章里小編給大家分享的是一篇關(guān)于php中使用array_filter()函數(shù)過(guò)濾數(shù)組實(shí)例講解,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03php安全開(kāi)發(fā) 添加隨機(jī)字符串驗(yàn)證,防止偽造跨站請(qǐng)求
偽造跨站請(qǐng)求比較難以防范,而且危害巨大,攻擊者可以通過(guò)這種方式惡作劇,發(fā)spam信息,刪除數(shù)據(jù)等等。那怎么防范偽造跨站攻擊呢2013-02-02修改Zend引擎實(shí)現(xiàn)PHP源碼加密的原理及實(shí)踐
來(lái)源:phphot PHP文件的源碼都是明文,這對(duì)于某些商業(yè)用途來(lái)說(shuō),并不適合。 因此考慮使用加密的手段保護(hù)源碼。 實(shí)在不耐煩等待zend出編譯器,而且編譯和加密本質(zhì)上不是一回事兒。自己動(dòng)手、開(kāi)始修改。2008-04-04