- 介绍
-
基础知识
- 1. 封装格式
- 2. 编码格式
- 3. 视频解码
- 4. 音频解码
- 5. 像素格式 - windows安装环境
-
常用命令
- 1. 音视频处理流程
- 2. 命令分类查询
- 3. ffplay
- 3.1. 主要命令
- 3.2. 本地视频音频的播放
- 3.3. 网络视频音频的播放,该链接来自哔哩哔哩,如果过期,请自己获取
- 3.4. 播放yuv数据
- 3.5. 播放rgb数据
- 3.6. 播放pcm数据
- 3.7. 视频旋转
- 3.8. 视频反转
- 3.9. 视频旋转和反转
- 3.10. 音频变速播放
- 3.11. 视频变速播放
- 3.12. 音视频变速播放 -
ffmpeg
- 1. 提取音视频
- 2. 提取像素数据
- 3. 提取pcm数据
- 4. 视频裁剪与合并
- 4.1. 找三个视频分辨截取10秒
- 4.2. 将截取的三个视频转成ts格式
- 4.3. 转成flv格式
- 4.4. 以MP4格式拼接
- 4.5. 以ts格式拼接
- 4.6. 以flv格式拼接
- 5. 图片和视频转换
- 5.1. 截取一张图片
- 5.2. 视频转图片
- 5.3. 视频生成gif
- 6. 录制视频
- 6.1. 查看可用设备列表
- 6.2. 录制视频
- 6.3. 录制声音
- 6.4. 查看视频录制的可选参数
- 7. 直播
- 8. 过滤器
- 8.1. 视频裁剪
- 8.2. 文字水印
- 8.3. 图片水印
- 8.4. 画中画
- 8.5. 多宫格
介绍
FFmpeg是一套可以用来记录、转换数字音频、视频
,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
项目地址:https://github.com/FFmpeg/FFmpeg
本文以windows平台为例,介绍ffmpeg的用法
基础知识
封装格式
MPEG-4、AVI、FLV
编码格式
视频部分:h264、wmv、xvid、mjpeg(摄像头出来的每一帧都是mjpeg,缺点在于只有I帧、没有B帧、P帧)
音频部分:acc、MP3、ape、flac
视频解码
软件解码:即通过软件让CPU来对视频进行解码处理,缺点耗电发热,优点兼容强
硬件解码:是将原来全部交由CPU(显卡上的一个核心处理芯片,处理计算机中与图形计算有关的工作)来处理的视频数据的部分交由GPU来做,优点不需要太好的CPU,发热低,缺点起步较晚,无法与软解相提并论,兼容性不强.硬解码都是固定帧率.比如只能60帧.
音频解码
将音频码流(aac、ape等)解码成pcm
像素格式
压缩编码中一般使用的是RGB24,YUV420 , YUV420P, YUV422P, YUV444P等格式数据,最常见的是YUV420P.
RGB格式
BMP文件存储的就是RGB格式像素数据
yuv格式
y表示明亮度,而u(Cb 蓝色色差值)和v(Cr 红色色差值)则表示色度值.它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,由于UV色度不是很明显看出,所以除了YUV4:4:4外,又诞生了YUV4:2:2,YUV4:2:0格式.从而占用极少的存储数据.
windows安装环境
官网地址:http://ffmpeg.org/
下载地址:http://ffmpeg.org/download.html#build-windows,
然后选择Windows builds by BtbN

将压缩包解压,bin目录配置到环境变量
使用 ffmpeg –version 命令验证是否配置成功。

bin目录下程序介绍:
ffmpeg:音视频编码器
ffplay:媒体播放器
ffprobe:多媒体流分析器
常用命令
基本信息
ffmpeg -h
高级信息
ffmpeg -h long
所有信息
ffmpeg -h full
音视频处理流程
input file->demuxer->decoder->encoder->muxer->output file
命令分类查询
例子: ffmpeg -formats | findstr mp4-version 显示版本
-buildconf 显示编译配置
-formats 显示可用格式(muxers+demuxers)
-muxers 显示可用复用器
-demuxers 显示可用解复用器
-codecs 显示可用编解码器
-decoders 显示可用解码器
-encoders 显示可用编码器
-bsfs 显示可用比特流filter
-protocols 显示可用的协议
-filters 显示可用的过滤器
-protocols 显示可用的协议
-pix_fmts 显示可用的像素格式
-sample_fmts 显示可用的音频采样率格式
-layouts 显示标准声道名称
-colors 显示可用的颜色名称


ffplay
ffplay xx.mp4
q,esc退出
f全屏
p暂停
a切换音频流
v切换视频流
s逐帧播放

主要命令
-x width 强制显示宽度
-y height 强制显示高度
-video_size size 帧尺寸(W✖H)
-pixel_format format 设置像素格式
-fs 以全屏模式启动
-an 禁用音频
-vn 禁用视频
-sn 禁用字幕
-ss pos 根据设置的秒进行定位拖动,
-t duration 设置播放音频视频长度
-bytes 按字节进行拖动
-nodisp 关闭图形化窗口
-noborder 无边框窗口
-volume vol 设置起始音量(0-100)
-f fmt 强制使用设置格式进行解析,如-f s16le
-window_title title 设置窗口标题
-loop number 设置循环次数
-showmode mode 设置显示模式,0视频,1音频波形,2音频频谱
-vf filtergraph 设置视频滤镜
-af filtergraph 设置音频滤镜
-stats 打印多个回放统计
-fast 非标准化规范的多媒体兼容优化
-genpts 生成pts
-sync type 同步类型设为audio、video、external,默认audio为主时钟
-ast audio_stream_specifier 指定音频流索引
-vst video_stream_specifier 指定视频流索引
-sst video_stream_specifier 指定字幕频流索引
-autoexit 视频播放完毕后退出
-autorotate 根据文件元数据自动旋转视频,0或1,默认为1
-codec:media_special codec_name 强制使用设置的多媒体解码器
-acodec codec_name 强制使用设置的音频解码器进行音频解码
-vcodec codec_name 强制使用设置的视频解码器进行视频解码
-scodec codec_name 强制使用设置的字幕解码器进行字幕解码
-framedrop 如果视频不同则丢弃视频帧
-infbuf 不限制缓冲区大小
本地视频音频的播放
ffplay "xx.mp4" -x 1000 -y 1000 -codec:v h264
ffplay -window_title "test_player" -ss 2 -t 10 autoexit test.mp4
ffplay -vcodec h264 test.mp4
网络视频音频的播放,该链接来自哔哩哔哩,如果过期,请自己获取
image.png
播放yuv数据
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
播放rgb数据
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb
播放pcm数据
ffplay -ar 48000 -ac 2 f32le 48000_2_f32le.pem
-ar set audio sampling rate
-ac set number of audio channels
视频旋转
ffplay -i test.mp4 -vf transpose=1
视频反转
ffplay test.mp4 -vf hflip
视频旋转和反转
ffplay test.mp4 -vf hflip,transpose=1
音频变速播放
ffplay -i test.mp4 -af atempo=2
视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2
音视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2
参数说明
-i 设置输入流
-f 设置输出格式
-ss 开始时间
-t 时间长度
音频参数
-aframes 设置输出的音频帧数
-b:a 音频码率
-ar 设定采样率
-ac 设定声音的channel数
-acodec 设置音频解码器
-an 不处理音频
-af 音频过滤器
视频参数
-vframes 设置要输出的视频帧数
-b设定视频码率
-b:v 视频码率
-r 设定帧速率
-s 设定画面的宽高
-vn 不处理视频
-aspect aspect 设置横纵比,4:3,1.333
-vcodec 设定视频解码器
-vf 视频过滤器
ffmpeg
提取音视频
ffmpeg -i test.mp4 -acodec copy -vn test.aac
ffmpeg -i test.mp4 -acodec copy -an test.h264
image.png
提取像素数据
提取yuv
ffmpeg -i test.mp4 -t 3 -pixel_format yuv420p test_yuv420p.yuv
提取rgb
ffmpeg -i test.mp4 -t 3 -pixel_format rgb24 test_rgb24.rgb
rgb与yuv转换
ffmpeg -s 320x240 -pix_fmt yuv420p -i test_yuv420p.yuv -pix_fmt rgb24 test_rgb24_convert.rgb
image.png
提取pcm数据
ffmpeg -i test.mp4 -ar 48000 -ac 2 -f s16le test_48000_2_s16e.pcm
ffmpeg -i test.mp4 -ar 48000 -ac 2 -sample_fmt s16 test_fmt_s16.wav
ffmpeg -i test.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le test_fmt_s16le.wav
image.png
保持编码格式
ffmpeg test.mp4 -vcodec copy -acodec copy test_copy.ts
改变编码格式
ffmpeg test.mp4 -vcodec libx265 -acodec libmp3lame test_h265_mp3.mkv
修改帧率
ffmpeg -i test.mp4 -r 15 test_out_r15.mkv
修改视频码率
ffmpeg -i test.mp4 -b:v 400k test_out_bv400k.mkv
修改视频分辨率
ffmpeg -i test.mp4 -s 480x320 test_out_480x320.mp4
修改音频码率
ffmpeg -i test.mp4 -b:a 192k test_out_ba192.mp4
修改音频采样率
ffmpeg -i test.mp4 -ar 44100 test_out_ar44100.mkv
视频裁剪与合并
找三个视频分辨截取10秒
ffmpeg -i demo1.mp4 -ss 00:00:05 -t 10 -codec copy demo1_merge1.mp4
ffmpeg -i demo2.mp4 -ss 00:00:05 -t 10 -codec copy demo2_merge1.mp4
ffmpeg -i demo3.mp4 -ss 00:00:05 -t 10 -codec copy demo3_merge1.mp4
将截取的三个视频转成ts格式
ffmpeg -i demo1_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo1_1.ts
ffmpeg -i demo2_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo2_1.ts
ffmpeg -i demo3_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo3_1.ts
转成flv格式
ffmpeg -i demo1_merge1.mp4 -codec copy demo1_1.flv
ffmpeg -i demo2_merge1.mp4 -codec copy demo2_1.flv
ffmpeg -i demo3_merge1.mp4 -codec copy demo3_1.flv
以MP4格式拼接
ffmpeg -i "concat:demo1_merge1.mp4|demo2_merge1.mp4|demo3_merge1.mp4" -codec copy demo_out_mp4.mp4
因为mp4格式整体有一层容器,而不像ts这类格式可以直接拼接,所以回报错Found duplicated MOOV Atom. Skipped,使用以下命令可解决问题,创建demomp4list.txt文件,写入如下内容
file 'demo1_merge1.mp4'
file 'demo2_merge1.mp4'
file 'demo3_merge1.mp4'
ffmpeg -f concat -i demomp4list.txt -codec copy demo_list_out_mp4.mp4
以ts格式拼接
ffmpeg -i "concat:demo1_1.ts|demo2_1.ts|demo3_1.ts" -codec copy demo_out_ts.mp4
ffmpeg -f concat -i demotslist.txt -codec copy demo_list_out_ts.mp4
以flv格式拼接
ffmpeg -i "concat:demo1_1.flv|demo2_1.flv|demo3_1.flv" -codec copy demo_out_flv.mp4
ffmpeg -f concat -i demoflvlist.txt -codec copy demo_list_out_flv.mp4
注意:视频编码格式需要通知,音频编码格式也需要统一,音频参数(采样率和声道)也需要统一
图片和视频转换
截取一张图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x480 test_pic1.jpg
-i 输入
-y 覆盖
-f 格式
视频转图片
ffmpeg -i test.mp4 -t 5 -s 640x480 -r 15 test_frame%03d.jpg
图片转视频
ffmpeg -f image2 -i test_frame%03d.jpg -r 25 test_img_video.mp4
image.png
视频生成gif
ffmpeg -i test.mp4 -t 5 -r 25 test_img_gif.gif
gif转视频
ffmpeg -f gif -i test_img_gif.gif test_gif.mp4
录制视频
需安装软件screen capture recorder
源码地址:https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases

因github下载较慢,可以选择以下地址:
http://sourceforge.net/projects/screencapturer/
查看可用设备列表
ffmpeg -list_devices true -f dshow -i dummy
image.png
录制视频
ffmpeg -f dshow -i video="screen-capture-recorder" record_video.mp4
注意:screen capture recorder程序的自带的ffmpeg和之前配置到环境变量的ffmpeg版本不一致,直接录制会出错,建议在Screen Capturer Recorder\configuration_setup_utility\vendor\ffmpeg\bin目录下执行录制命令
使用摄像头设备录制
ffmpeg -f dshow -i video="XiaoMi USB 2.0 Webcam" record_video.mp4
录制声音
ffmpeg -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" record_audio.aac
录制视频和声音
ffmpeg -f dshow -i video="XiaoMi USB 2.0 Webcam" -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" -y record_out.mp4
查看视频录制的可选参数
ffmpeg -f dshow -list_options true -i video="XiaoMi USB 2.0 Webcam"
指定参数录制
ffmpeg -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" -f dshow -i video="XiaoMi USB 2.0 Webcam" -vcodec h264_qsv -b:v 3M -r 15 -y record_out2.mp4
直播
直播拉流
ffplay https://cn-jssz-cm-02-34.bilivideo.com/live-bvc/614605/live_563132373_9127159/index.m3u8?expires=1674213493&len=0&oi=0x24098a0c2437a830f00481b822e575&pt=web&qn=0&trid=10073e458b2968f443b6a2c1d1080ea389f2&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=a8b5c0c3a704b8a9e05f984582d107a2&sk=112b71c9500ea6163d6789593d561f59&flvsk=20767cae16248d0a0dd594520859aac5&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-jssz-cm-02-34&chash=1&sche=ban&bvchls=1&score=6&pp=rtmp&machinezone=jd&source=onetier&trace=8&site=efbbb1495de5db1444960c216098a600&order=1
ffmpeg -i "https://cn-jssz-cm-02-34.bilivideo.com/live-bvc/614605/live_563132373_9127159/index.m3u8?expires=1674213493&len=0&oi=0x24098a0c2437a830f00481b822e575&pt=web&qn=0&trid=10073e458b2968f443b6a2c1d1080ea389f2&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=a8b5c0c3a704b8a9e05f984582d107a2&sk=112b71c9500ea6163d6789593d561f59&flvsk=20767cae16248d0a0dd594520859aac5&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-jssz-cm-02-34&chash=1&sche=ban&bvchls=1&score=6&pp=rtmp&machinezone=jd&source=onetier&trace=8&site=efbbb1495de5db1444960c216098a600&order=1" bilibili1.flv
直播推流
ffmpeg -re -i out.mp4 -c copy rtmp://server/live/streamName
本地部署推流服务器请参考:https://www.jianshu.com/p/16741e363a77
过滤器
视频裁剪
ffmpeg -i test_pic1.jpg -vf crop=iw/3:ih:0:0 crop.jpg
文字水印
ffplay -i demo1.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerief.ttf:fontcolor=green:text='hello world':x=20:y=20:alpha=0.5:box=1:boxcolor=yellow"
image.png
跑马灯等效果请自行查阅文档
图片水印
ffplay -i demo1.mp4 -vf "movie="logo.webp[watermark];[in][watermark]overlay=x=10:y=10"
使用ffmpeg可以生成带水印的新视频
画中画
ffplay -i demo2.mp4 -vf "movie=demo1.mp4,scale=320x240[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
image.png
多宫格
ffmpeg -i demo1.mp4 -i demo2.mp4 -i demo3.mp4
-filter_complex "nullsrc=size=640x480[base];
[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];
[1:v] setpts=PTS-STARTPTS,scale=320x240[upperright];
[2:v] setpts=PTS-STARTPTS,scale=640x240[lower];
[base][upperleft] overlay=shortest=1[tmp1];
[tmp1][upperright]overlay=shortest=1:x=320[tmp2];
[tmp2][lower]overlay=shortest=1:y=320;" dem0_grid.mp4
去掉换行符为这样:
ffmpeg -i demo1.mp4 -i demo2.mp4 -i demo3.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS,scale=640x240[lower];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lower]overlay=shortest=1:y=320" demo_grid.mp4
image.png
网友评论