引入ffmpeg进行视频转音频/音频格式转换。
环境初始化
安装ffmpeg,linux下:apt-get install -y ffmpeg
确认ffmpeg命令可执行后获取ffmpeg-go包。
docker内使用的话,可以在操作系统基础镜像下安装ffmpeg再运行程序,或者源码编译。ffmpeg有很多动态库依赖,直接安装方便些…
代码示例
1. 音频格式转换
ffmpeg命令执行如下:
ffmpeg -i input.mp3 -ar 16000 -ac 1 -y output.wav
上述命令指定了输入文件为input.mp3,输出采样率为16kHz,单声道的文件output.wav。
对应的go代码如下
err = ffmpeg.
Input("input.mp3").
Output("output.wav", ffmpeg.KwArgs{
"ar": fmt.Sprintf("%d", dstSamplerate), // 设置目标采样率
"ac": fmt.Sprintf("%d", dstChannels), // 设置目标声道数
"y": "", // 允许覆盖输出文件
}).ErrorToStdOut().Run()
💡推荐调用ErrorToStdOut()函数,会在终端输出执行日志,便于排查问题。
如果使用的是文件流,可以采用以下代码
// 使用 ffmpeg 处理输入流
err = ffmpeg.
Input("pipe:", ffmpeg.KwArgs{"format": fileExt[1:]}).
WithInput(file). //文件输入流
Output("pipe:", ffmpeg.KwArgs{
"format":"wav",
"ar": fmt.Sprintf("%d", dstSamplerate), // 设置目标采样率
"ac": fmt.Sprintf("%d", dstChannels), // 设置目标声道数
"y": "", // 允许覆盖输出文件
}).
WithOutput(writer). //文件输出流
ErrorToStdOut().
Run()
"pipe:"参数表明从管道中读取数据,WithInput、WithOutput指定文件流
2.视频提取音频
ffmpeg命令执行如下:
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 -y output.wav
-vn 标识不处理视频,
-acodec指明声音的编解码器,上述命令指定使用16位有符号整数且采用小端字节序的 PCM 音频格式
go代码如下:
// 使用 ffmpeg 提取音频
err = ffmpeg.
Input(inputFile.Name(), ffmpeg.KwArgs{
// "format": fileExt[1:],
"analyzeduration": "100M", //分析持续时间
"probesize": "100M", //分析数据大小
"fflags": "+genpts", //生成缺失的时间戳
}).
Output(outputFile.Name(),
ffmpeg.KwArgs{
"vn": "", //忽略视频
"acodec": "pcm_s16le", //设置音频编码格式
"ar": fmt.Sprintf("%d", dstSamplerate), // 设置目标采样率
"ac": fmt.Sprintf("%d", dstChannels), // 设置目标声道数
"y": "", // 允许覆盖输出文件
}).ErrorToStdOut().Run()
```