采用FFmpeg从视频中提取音频(声音)保存为mp3文件
下载mp3的编码库
因为FFmpeg默认只支持mp3的解码,不支持mp3编码.需要借助第三方的mp3编码库。这里采用lame编码库 下载地址
1 | cd lame-3.100 |
下载FFmpeg
下载
1 | git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg |
brew
1 | brew install ffmpeg |
编译
1 | ./configure --enable-libmp3lame |
提取音频
1 | ffmpeg -i apple.mp4 -f mp3 -vn apple.mp3 |
mp4 -> wav
1 | ffmpeg -i .xx.mp4 -f wav -ar 16000 xx.wav |
wav -> mp3
1 | ffmepg -i input.wav -f mp3 -acodec libmp3lame -y output.mp3 |
扩展信息
1 | ffmpeg -i apple.mp4 |
常用参数说明:
主要参数: -i 设定输入流 -f 设定输出格式 -ss 开始时间
视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频
混音
会把2个输入音频流混合成一个输出流,持续时间采用第一个输入流的持续时间并且有2秒的结束过渡1
ffmpeg -i apple.mp3 -i 天后.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 a.mp3
inputs: 输入数,如果没有指定则默认为2
duration: 确定流结束的方法,有:
- longest: 按最长持续时间输入(默认)
- shortest: 按最短持续时间输入
- first: 按第一个输入持续时间
- dropout_trnsition: 过渡时间,单位秒,指一个输入流结束时音量从正常到无声渐止效果,默认为2秒
图片 + 音频 = 视频
方案一
1 | ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4 |
-threads 2 以两个线程进行运行, 加快处理的速度。
-y 对输出文件进行覆盖
-r 10 fps 帧率 设置为10帧/秒 可以指定两个帧率,输入帧率,输出帧率;
- 输入帧率:-i之前,设定读入帧率,比如 -r 0.5 ,也就是说1秒要播0.5个图片,那么一个图也就是要播2s;
- 输出频率:-i之后,真正的输出视频播放帧率,不写话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播2
s,那么输出文件播放时,这2s内,都是这张图,但是播放了60帧。
-i /tmpdir/image%04d.jpg 输入图片文件,图片文件保存为 image0001.jpg image0002.jpg ….
-i audio.mp3 输入的音频文件
-absf aac_adtstoasc 将结果的音频格式转为faac格式时需要这个选项。将音频格式转为faac是因为在iphone上某些音频格式的视频无法播放,例如mp3. 但faac格式的音频的视频在iphone上可以播放。-absf 的意思是设置一个bitstream filter进行某些转换。可以用ffmpeg -bsfs 查看所有支持的bitstream filter。 bitstream filter和 aac_adtstoasc的具体含义我也说不上。但是如果不用这个选项又会导致转换失败。!
问题:
图片不能循环轮播
方案二
1 | ffmpeg -loop 1 -f image2 -r 1 -i img/appstore%d.png -t 60 image.mp4 |
- -loop 1循环读输入 0读完就不读了
- -t 输出视频总时长
- -b 指定200k码率
1 | ffmpeg -i image.mp4 -i a.mp3 imageVideo.mp4 |
方案三
1 | ffmpeg -loop 1 -f image2 -s 720x1280 -r 5 -i img/black.png -vcodec libx264 -pix_fmt yuv420p -t 180 black.mp4 |
- -r is the framerate (fps)
- -crf is the quality, lower means better quality, 15-25 is usually good
- -s is the resolution
- -pix_fmt yuv420p specifies the pixel format, change this as needed
问题:
视频 跟音频的时长必须统一