FFmpeg是一种自由的开源命令行工具,用于对多媒体文件进行格式转换。它包含一组共享的音频和视频库,例如libavcodec,libavformat和libavutil。
使用FFmpeg,您可以在各种视频和音频格式之间转换,设置采样率并调整视频大小。
为了能够在Ubuntu系统上添加新的存储库并安装软件,您必须以具有sudo权限的用户身份登录。
官方的Ubuntu存储库包含FFmpeg软件包,可以使用apt
软件包管理器进行安装。这是在Ubuntu安装FFmpeg的最简单方法,但是存储库中包含的版本可能落后于最新版本的FFmpeg。
在撰写本文时,Ubuntu 18.04存储库中可用的FFmpeg的当前版本为3.3.3。如果你需要安装安装FFmpeg 3.x。可以运行以下命令。
首先更新软件包列表,运行命令sudo apt update
。接下来,运行命令sudo apt install ffmpeg
安装FFmpeg以下命令。
安装完成后,运行ffmpeg -version
命令验证软件包是否已正确安装,该命令将打印FFmpeg版本。
也可以运行ffmpeg -encoders
命令打印所有可用的FFmpeg编码器和解码器来验证。FFmpeg 3.x现在已安装在您的系统上。
安装直接用 apt 安装即可,源码安装比较麻烦
sudo apt update
sudo apt install ffmpeg
ffmpeg -decoders
ffmpeg -version
对了,涉及到本地开发,可能你本地也得安装ffmpeg,比如mac下,可以直接brew安装,命令如下:
brew install ffmpeg
转换mp4 webm
使用ffmpeg
转换音频和视频文件时,不必指定输入和输出格式。 FFmpeg自动检测输入文件的格式,并从文件扩展名中猜测输出格式。
以下是两个简单的示例,将视频文件从mp4转换为webm。将音频文件从mp3转换为ogg。
ffmpeg -i input.mp4 output.webm
ffmpeg -i input.mp3 output.ogg
指定编解码器
转换文件时,使用-c
选项指定编解码器。它可以是任何受支持的解码器/编码器的名称,也可以是仅复制输入流的特殊值copy
。
下面的例子,使用libvpx
视频编解码器和libvorbis
音频编解码器将视频文件从mp4转换为webm。使用libopus
编解码器将音频文件从mp3转换为ogg。
ffmpeg -i input.mp4 -c:v libvpx -c:a libvorbis output.webm
ffmpeg -i input.mp3 -c:a libopus output.ogg
PHP调用ffmpeg
微信公众号开发文档里有个录音转文字功能,录音可以直接传到临时素材,但是录音格式是amr的,iOS系统下不支持,如果你想实现录音和文字同时展示给用户的话,你就得把amr转下格式才行。
当前端将录音数据 serverId(返回音频的服务器端ID)传递给后端,后端利用下方接口获取微信服务器存储的录音数据。
获取临时素材,很简单,代码如下(这里用的easywechat配合laravel)
/**
* 获取临时素材
* https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_temporary_materials.html
* @param string|null $media_id
* @return string|bool
*/
public function getTemporaryMedia(string $media_id=null): bool|string
{
if(empty($media_id)) return false;
return "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" . $this->getAccessToken() . "&media_id=$media_id";
}
调用获取临时素材接口,获取数据后将文件存储到自己服务器上,存储的音频格式为amr。下面,我们要下载这个amr并转化为mp3,然后传到自己的oss里。
代码如下(这里用的laravel,代码不完整,仅供参考)
/**
* 保存微信素材到 Oss
* @param $media_id
* @return string
*/
public function mpMediaToOss($media_id): string
{
$media = WechatService::instance()->getTemporaryMedia($media_id);
if(empty($media)) return '';
// 下载微信临时素材
$file = Http::get($media);
$file_name = $file->header('Content-disposition');
$partnner = '!filename="(.*)"!';
preg_match_all($partnner, $file_name, $match);
$file_name = $match [1] [0]??$media_id;
// 保存临时素材到本地
$local = storage_path('app/').$file_name;//本地路径
file_put_contents($local,$file->body());//保存文件到本地
//转换音频格式(iOS不支持amr,这里转成mp3)
$path_info = pathInfo($local);
$mp3 = "{$path_info ['dirname']}/{$path_info ['filename']}.mp3";
$mp3_name = "{$path_info ['filename']}.mp3";
$command = "ffmpeg -i " . $local . " " . $mp3 . " 2>&1";
exec($command);
// 保存临时素材到 oss
$file = new UploadedFile($mp3,$mp3);
$dir = "operation_voices";//oss 存储路径
$disk = Storage::disk('oss');
$result = $disk->putFileAs($dir, $file,$mp3_name);
if($result){
@unlink($local);@unlink($mp3);//删除本地文件
$config = Config::get('filesystems.disks.oss');
return "{$config ['base_url']}/{$result}";
}
@unlink($local);@unlink($mp3);//删除本地文件
return $media_id;
}
本文的重点是如何调用ffmpeg转化格式,截取上面代码如下:
//转换音频格式(iOS不支持amr,这里转成mp3)
$path_info = pathInfo($local);
$mp3 = "{$path_info ['dirname']}/{$path_info ['filename']}.mp3";
$mp3_name = "{$path_info ['filename']}.mp3";
$command = "ffmpeg -i " . $local . " " . $mp3 . " 2>&1";
exec($command);