php-ffmpeg相关操作简介

简介:php-ffmpeg获取视频的时长,ffmpeg视频转GIF,ffmpeg视频格式转换,ffmpeg获取视频中的音频,ffmpeg给视频添加水印,音频的人生和伴奏分离

php操作ffmpeg有两个扩展,一个是ffmpeg-php,这个是不依赖ffmpeg,需要编译安装并在 php.ini 中启用。还有一个是php-ffmpeg,使用php-ffmpeg需要安装ffmpeg软件,对于ffmpeg的安装可以看看我之前的文章【Linux安装ffmpeg

ffmpeg-php官方已经很久没有更新了。我们这里主要针对php-ffmpeg进行说明

扩展安装

composer require php-ffmpeg/php-ffmpeg

获取视频时长

use FFMpeg\FFProbe;
$videoPath = 'path/to/video.mp4';
$ffprobe = FFProbe::create();
$duration = $ffprobe->format($videoPath)->get('duration');
echo "视频时长:{$duration} 秒";

如果我们使用了ffmpeg打开一个视频时,可以通过getFormat获取ffprobe对象:

$ffmpeg = FFMpeg\FFMpeg::create();
$video_path = '视频路径';
$video = $ffmpeg->open($video_path);
$duration = $video->getFormat()->get('duration')
echo "视频时长:{$duration} 秒";

获取视频的宽度和高度

$ffmpeg = FFMpeg\FFMpeg::create();
$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

$videoInfo = $video->getStreams()->videos()->first();

echo "视频宽度:{$videoInfo->get('width')} 高度:{$videoInfo->get('height')}";

视频格式转换

视频格式有很多中,php-ffmpeg中提供了5中格式的转换,下面我以x264为例:

$ffmpeg = FFMpeg\FFMpeg::create();

$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

//转换视频
$video->save(new FFMpeg\Format\Video\WMV(),'output.wmv');
//$video->save(new FFMpeg\Format\Video\X264(),$root_path.'/output_x264.mp4');
//$video->save(new FFMpeg\Format\Video\WebM(),$root_path.'/output.webm');
//$video->save(new FFMpeg\Format\Video\Ogg(),$root_path.'/output.ogv');
//$video->save(new FFMpeg\Format\Video\WMV3(),$root_path.'/output.wmv');

视频转GIF

$ffmpeg = FFMpeg\FFMpeg::create();

$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

$output_path = '输出路径,例如:/root/1.gif';
$gif = $video->gif(FFMpeg\Coordinate\TimeCode::fromSeconds(1),
    new FFMpeg\Coordinate\Dimension(480, 640), 3);
$gif->save($output_path);

读取视频中的音频

$ffmpeg = FFMpeg\FFMpeg::create();

$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

$output_path = '输出路径,例如:/root//audio.mp3';
$audio_format = new FFMpeg\Format\Audio\Mp3();
$video->save($audio_format, $output_path);

视频添加水印

现有的方法中,php-ffmpeg提供添加图片水印,这个是官方比较推荐的方法。主要是因为文本水印由于编码问题可能导致乱码

$ffmpeg = FFMpeg\FFMpeg::create();

$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

$output_path = '输出路径,例如:/root//watermark_video.mp4';
$watermarkpath = '水印图片的路径';
$video->filters()->watermark($watermarkpath,[
    'position'=>'relative',
    'bottom'=>50,
    'right'=>50,
    'width'=>100
]);
$video->save(new FFMpeg\Format\Video\X264(),$output_path);

如果文本只是英文可使用如下方法:

$ffmpeg = FFMpeg\FFMpeg::create();

$video_path = '视频路径';
$video = $ffmpeg->open($video_path);

$output_path = '输出路径,例如:/root//watermark_video.mp4';
//文本水印ffmpeg原生命令格式
$custom_str = "drawtext=fontfile='%s':text='%s':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2";
//文本水印字体的名称
$fontfile = 'arial.ttf';
$custom_str = sprintf($custom_str,$fontfile,$watermark);
//将原生命令添加到过滤器中
$video->filters()->custom($custom_str);
//执行添加水印并保存到本地,参数一:添加水印后的视频格式。参数二:输出路径
$video->save(new FFMpeg\Format\Video\X264(),$output_path);

注意:最好不要添加中文水印,会乱码,目前还没有找到好的解决方案。如果一定要中文水印,可以先将中文绘制成一张图片,在使用图片水印的方式

多图合成webp

ffmpeg -hide_banner -loglevel error -framerate 10 -i 输入图片 -c:v libwebp -lossless 0 -loop 0 -y 输出路径

输入图片格式:/tem/source/%d.png

%d:代表数字格式

音频的人生和伴奏分离

ffmpeg -i input.mp3 -filter_complex "asplit=channel_layout=stereo:clone=1" -map "[asplit0]" vocals.wav -map "[asplit1]" accompaniment.wav

-i input.mp3:指定输入的音频文件。

-filter_complex:用于定义复杂的过滤器,

asplit:是一个分割过滤器,它可以根据指定的条件分割音频流。

channel_layout=stereo:意味着输入假定为立体声布局,

clone=1:意味着输入将被克隆。

-map:选项用于指定输出文件。

[asplit0]:是原始的伴奏音流,

[asplit1]:是克隆的伴奏音流,分别被映射到accompaniment.wav和vocals.wav文件。 

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1