欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP調(diào)用FFMpeg實(shí)現(xiàn)音視頻操作的示例詳解

 更新時(shí)間:2023年10月20日 08:14:22   作者:極客飛兔  
這篇文章主要為大家詳細(xì)介紹了PHP如何調(diào)用FFMpeg實(shí)現(xiàn)簡(jiǎn)單的音視頻操作,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下

安裝PHP-FFMpeg

composer require php-ffmpeg/php-ffmpeg

視頻中提取一張圖片

  • 這里的 video.mp4 準(zhǔn)備的是一段宮崎駿的視頻片段
  • FFMpeg\FFMpeg::create 中需要指定系統(tǒng)軟件中 ffmpegffprobe 的安裝位置
  • 通過(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ě) xy 坐標(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)文章

最新評(píng)論