February 8, 2021
By: alisa

FFmpeg流媒体处理

  1. FFmpeg
    1. 压缩加水印
    2. 获取时长
    3. 视频剪切
    4. 提取GIF和缩略图
    5. 视频合成
    6. 保留视频原声,混合背景音乐
    7. 视频纵向拼接

在对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
```
Tags: 音视频 FFmpeg 流媒体