February 8, 2021
By: alisa
FFmpeg流媒体处理
在对ffmpeg命令有初步了解的基础后, 进行音视频的简单处理
FFmpeg
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg 有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等功能。 放上FFmpeg官网链接: About FFmpegFFmpeg Documentation
压缩加水印
```
ffmpeg -i d:/mnt/nas/avideo_01.mp4 -i d:/mnt/nas/test/pic_shuiyin.png -filter_complex "[0:v]scale=trunc(480*a/2)*2:480[bg];[bg][1:v]overlay=trunc(main_w/2)-trunc(overlay_w/2):trunc(main_h/2)-trunc(overlay_h/2)" -c:a copy d:/mnt/nas/avideo_01_compress.mp4
```
特别注意:trunc是解决宽度是小数时报错的问题
```
ffmpeg -i d:/mnt/nas/avideo_01.mp4 -i d:/mnt/nas/test/pic_shuiyin.png -filter_complex "[0:v]scale=480*a:480[bg];[bg][1:v]overlay=main_w/2-overlay_w/2:main_h/2-overlay_h/2" -c:a copy d:/mnt/nas/avideo_01_compress.mp4
```
获取时长
```
ffprobe d:/mnt/nas/avideo_02.mp4
```
```
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 d:/mnt/nas/avideo_02.mp4
```
注意输出时长格式
视频剪切
```
ffmpeg -ss 00:00:01.000 -to 00:01:00.00 -accurate_seek -i d:/mnt/nas/avideo_02.mp4 -c copy d:/mnt/nas/avideo_cut.mp4
```
注意用-accurate_seek -ss -to要放在-i前面,解决前几秒黑屏问题。
尽量不用下面的命令:
```
ffmpeg -i d:/mnt/nas/avideo_02.mp4 -ss 00:00:01.000 -to 00:01:00.00 -c copy d:/mnt/nas/avideo_cut.mp4
```
提取GIF和缩略图
提取GIF
```
ffmpeg -i d:/mnt/nas/avideo_cut.mp4 -ss 00:00:01 -t 3 d:/mnt/nas/avideo_02.gif
```
注意用-vframes代替-t解决前几秒黑屏导致异常报错的问题
```
ffmpeg -i d:/mnt/nas/avideo_02.mp4 -ss 00:00:01 -vframes 100 d:/mnt/nas/avideo_02.gif
```
缩略图
```
ffmpeg -i d:/mnt/nas/avideo_02.mp4 -f image2 -ss 00:00:01 -vframes 1 d:/mnt/nas/avideo_02.jpg
```
视频合成
不保留原声 avi:
```
ffmpeg -safe 0 -f concat -i d:/mnt/nas/concat.txt -an -c:v copy d:/mnt/nas/avideo_concat.mp4
```
保留原声:
```
ffmpeg -safe 0 -f concat -i d:/mnt/nas/concat.txt -c copy d:/mnt/nas/avideo_concat.mp4
```
保留视频原声,混合背景音乐
1. **必需提前处理视频转码,统一视频帧率和音频的采样率**
```
ffmpeg -i d:/mnt/nas/avideo_01.mp4 -c:a mp3 -ar 48000 -r 30000/1001 -video_track_timescale 30k d:/mnt/nas/avideo_01_convert.mp4
```
```
ffmpeg -i d:/mnt/nas/avideo_02.mp4 -c:a mp3 -ar 48000 -r 30000/1001 -video_track_timescale 30k d:/mnt/nas/avideo_02_convert.mp4
```
```
ffmpeg -i d:/mnt/nas/avideo_03.mp4 -c:a mp3 -ar 48000 -r 30000/1001 -video_track_timescale 30k d:/mnt/nas/avideo_03_convert.mp4
```
2. 合成命令
```
ffmpeg -safe 0 -f concat -i d:/mnt/nas/concat_convert.txt -c copy d:/mnt/nas/avideo_concat.mp4
```
```
ffmpeg -safe 0 -f concat -i d:/mnt/nas/concat_convert.txt -an -c copy d:/mnt/nas/avideo_concat.mp4
```
3. 混合背景音乐, 视频时长比音频长则要循环背景音乐
保留原声(不保留原声时,用此方法报错):
```
ffmpeg -i d:/mnt/nas/avideo_concat.mp4 -stream_loop -1 -i d:/mnt/nas/bgm_01.mp3 -shortest -filter_complex amix -c:v copy D:/mnt/nas/avideo_concat_end.mp4
```
```
ffmpeg -i d:/mnt/nas/avideo_concat.mp4 -stream_loop -1 -i d:/mnt/nas/bgm_01.mp3 -shortest -filter_complex amerge -ac 2 -c:v copy D:/mnt/nas/avideo_concat_end.mp4
```
不保留原声:
```
ffmpeg -i d:/mnt/nas/avideo_concat.mp4 -stream_loop -1 -i d:/mnt/nas/bgm_01.mp3 -shortest -c:v copy -map 0:v -map 1:a -y D:/mnt/nas/avideo_concat_end_an.mp4
```
视频纵向拼接
合并两个视频
```
ffmpeg -i avideo_02_convert.mp4 -i avideo_03_convert.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out.mp4
```
声音两者都保留
```
ffmpeg -i avideo_02_convert.mp4 -i avideo_03_convert.mp4 -filter_complex "[0:a][1:a]amix=[outa];[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h[outv]" -map "[outa]" -map "[outv]" out.mp4
```
合并3个视频
```
ffmpeg -i avideo_01_convert.mp4 -i avideo_02_convert.mp4 -i avideo_03_convert.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out.mp4
```