php使用ffmpeg扩展操作视频
前情
因公司业务需要,决定研究下ffmpeg。
断断续续经过几天的安装,找资料忽然发现已经搜了这么多文章了还没安装成功。
打起精神毕竟
于是在多篇文章中发现了很多问题的相同点,抓住相同点去分析问题
终于成功了。
多去尝试自己去解决问题,大多数问题通过网上文章认真分析都可以解决,毕竟都是前车之鉴,多点耐心,记住心态一定不能崩,下面进入正文。
一、什么是ffmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
具备那些功能
多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
1.视频采集功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
2.视频格式转换功能
ffmpeg视频转换功能。视频格式转换。
ffmpeg可以实现多种视频格式之间的相互转换(wma,rm,avi,mod等)。
3.视频截图功能
对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。
4.给视频加水印功能
使用ffmpeg 视频添加水印或者logo。
二、安装
1.安装nasm
Netwide Assembler (简称 NASM)是一款基于x86架构的汇编与反汇编软件。它可以用来编写16位(8086、80286等)、32位(IA-32)和64位(x86_64)的程序。 NASM被认为是Linux平台上最受欢迎的汇编工具之一。
ffmpeg为了提高效率使用了汇编指令
wget https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/nasm-2.13.03.tar.gz
cd nasm-2.13.03/
./configure
make
make install
查看是否安装成功
nasm --version
2.安装yasm
yasm是在nasm的基础上开发的,与nasm同宗。由于使用了相同的语法,因此nasm的代码可以直接用yasm来编译。
在http://www.tortall.net/projects/yasm/releases链接 找到适合自己的yasm版本。然后进行安装。
举例如下:
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
查看是否安装成功
yasm --version
3.安装libx264
libx264 是个库文件,用于编码
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-shared --enable-static --disable-asm
make
make install
查看是否安装成功
x264 --version
4.安装ffmpeg
提前提醒
./configure 命令操作后提示这个信息
执行下面命令后 再执行./configure命令
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz
tar xvJf ffmpeg-4.4.tar.xz
cd ffmpeg-4.4
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264
make
make install
安装ffmpeg比较耗时间,耐心等待
tips
configure --prefix= 的作用是编译的时候用来指定程序存放路径
--enable-libx264 指令来添加其第三方库使得编译的ffmpeg具有H.264的编码功能
5.添加环境变量
vi /etc/profile
在文件末尾添加
export PATH=$PATH:/usr/local/ffmpeg/bin
保存退出 执行下面命令 设置生效
source /etc/profile
查看是否安装成功
ffmpeg
6.进行配置
如果报没有 .so 链接库错误信息,就配置下动态库
1.)编辑动态库配置
vi /etc/ld.so.conf
在文件末尾添加
/usr/local/ffmpeg/lib
保存退出后执行下面命令刷新
ldconfig
7.ffmpeg使用语法
命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
1、参数选项:
(1) -an: 去掉音频
(2) -acodec: 音频选项, 一般后面加copy表示拷贝
(3) -vcodec:视频选项,一般后面加copy表示拷贝
2、格式:
(1) h264: 表示输出的是h264的视频裸流
(2) mp4: 表示输出的是mp4的视频
(3)mpegts: 表示ts视频流
例:视频压缩
ffmpeg -i 原文件路径 -c:v libx264 -crf 30 -c:a aac 输出文件路径
三、php使用
1.下载依赖包
$ composer require php-ffmpeg/php-ffmpeg
具体使用方法查看包 README.md 文件,下面列举常用例子
2.基本用法
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');
$video
->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
3.创建操纵媒体的对象
$ffmpeg = FFMpeg\FFMpeg::create();
FFMpeg自动检测ffmpeg和ffprobe文件。如果想给设置路径,可以用数组形式作为配置传递。
$ffmpeg = FFMpeg\FFMpeg::create(array(
'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg',
'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
'timeout' => 3600, // The timeout for the underlying process
'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use
), $logger);
4.转码
$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');
5.提取图像
$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(42));
$frame->save('image.jpg');
6.裁剪视频
$clip = $video->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
$clip->save(new FFMpeg\Format\Video\X264(), 'video.avi');
四、文档
五、tips
视频处理比较费服务器,服务器配置不高处理一个视频cpu就会爆,建议不要安装在业务服务器,避免影响业务。
php也可以直接操作
例:
<?php
exec('ffmpeg -i 源文件路径 -c:v libx264 -crf 30 -c:a aac 输出路径');
六、闲聊
35岁是程序员瓶颈吗?
程序员是一个靠知识吃饭的行业,这行业的技术迭代是最快的。如果想要保持不掉队,那就一刻都不能放松。
尽量提升自己的影响力,在公司掌握核心技术及业务,能力强的人永远不怕大龄。
只要你足够优秀,好运气一定会来找你!