FFmpeg的介绍
- FFmpeg由Fabrice Bellard于2000年创建,由C和汇编语言进行开发
- FF -> Fast Forward 快进
- mpeg -> 标准化组织 Moving Pictures Experts Group
- 使用到FFmpeg的开源项目
- gstreamer: a framework for streaming media
- chromium
- mpv: Command line video player
- kdenlive: Free and open source video editor, based on MLT Framework and KDE Frameworks 5
- synfig: Synfig Studio is a free and open-source 2D animation software, designed as powerful industrial-strength solution for creating film-quality animation using a vector and bitmap artwork.
- FFmpegMediaMetadataRetriever: provides a unified interface for retrieving frame and meta data from an input media file
- HandBrake: HandBrake is an open-source video transcoder available for Linux, Mac, and Windows
- Nadeshiko: A Linux tool to cut short videos with ffmpeg
- 更多项目可以参考projects.html
参考链接
命令行工具介绍
- ffmpeg: 对音视频、图片数据进行编解码、格式转换、分割和合并
- ffplay:媒体播放器 使用了ffmpeg和sdl库
- ffprobe:音视频文件分析工具
播放器架构
- 对文件进行解复用,分离音频和视频
- 音频通过MP3进行播放
- 视频通过YUV进行播放
- 解复用分离音视频 用到了FFmpeg技术
- 播放的时候 需要注意 音视频 同步
![](https://i-blog.csdnimg.cn/blog_migrate/01a1294cf97e6ce8e434509725a23ef9.png)
FFMpeg都能做啥
- FFmpeg是一个非常优秀的多媒体框架,具有开源、免费、跨平台的特性
- 对音频和视频的处理需要对应的插件进行处理
- 可以运行在Linux MAC Windows等诸多应用平台上
- 功能:编码 解码 转码 复用 解复用 过滤音视频数据 视频录制 媒体格式转换
FFmpeg文件介绍
- libavformat 对多媒体格式的解析和封装,如MP4、FLV、TS等文件的封装格式,RTMP、RTSP、HLS等网络协议封装格式
- libavutil 常用的工具函数库 包括随机数生成器、数据结构、数学工具、核心多媒体工具
- libavcodec 音频编解码,只负责调用插件,本身并不会自主执行
- libavdevice 对多媒体输入和输出设备的信息进行采集和呈现,包括Video4Linux2,VfW,DShow和ALSA
- libavresample 对音频重新采样
- libavfilter 对音视频的后期处理 滤镜
- libswresample 对音频操作。提供了转换音频的采样频率、声道格式或者样本格式的功能
- libswscale 对视频的操作,高度优化的图像比例缩放、图像颜色空间/像素格式的转换,如rgb和yuv之间的转换
FFmpeg 常用命令 分类
- 基本信息查询
- 录制命令 音频和视频
- 分解/复用命令
- 处理原始数据命令 处理视频/音频采集的原始数据
- 裁剪与合并命令
- 图片和视频互转命令
- 直播相关命令
- 各种滤镜命令
![](https://i-blog.csdnimg.cn/blog_migrate/96d1e5ea09b326caa9dd3bb3305aaf65.png)
FFmpeg处理流程
- 输入文件 mp4 mov格式的文件,这是一个封装,包含了音频和视频等数据
- 对输入文件进行demuxer得到编码数据(视频和音频),编码数据包是经过压缩的
- 对编码数据包 进行 解码 得到 数据帧,此刻的数据帧是 高度还原 原始数据信息,也就是使用麦克风直接采集到的数据,但是不是完全一样的。对数据帧进行重新编码,进行封装
![](https://i-blog.csdnimg.cn/blog_migrate/2fc755a61385b4ba4f7931022076009d.png)
FFmpeg基本信息查询命令
- -demuxers 和 -muxers 分解 和 封装的格式
- -devices 将其当做一个 输入设备,音频、视频、桌面设备
- -protocol 支持的网络协议,将网络文件作为输入
- -filters 加水印 去除水印
- -pix_fmts 像素格式 rgm YUV
- -sample_fmts 可用的采样模式 每一个采样点大小 ,使用多少字节存储一个采用,8位 16位 浮点型还是整数型等
- -layouts 显示channel名称,单声道 多声道 还是 立体声
![](https://i-blog.csdnimg.cn/blog_migrate/89e0349dd6f4e30dfdc90cece9729de2.png)
FFmpeg录制命令
录制视频
- ffmpeg -f avfoundation -i 1 -r 30 out.yuv
- -f:指定使用avfoundation进行数据采集
- -i:指定输入,从哪采集数据,他是一个文件的索引号,1 代表屏幕 0代表摄像头
- -r:指定帧率 25帧就算比较流畅,60帧以上高清
- out.yuv 保存后的数据格式 yuv表示原始数据,比较大,无压缩
- ctrl + c 结束录制
- ffplay -s 2560x1600 -pix_fmt uyvy422 out.yuv
- 因为yuv格式的文件未封装,ffplay不知道如何播放
- 但是ffmpeg在进行视频录制的过程中会保存相关的配置信息,播放时需要指定即可
- -pix_fmt uyvy422 像素格式
- ffmpeg -f avfoundation -list_devices true -i “”显示设备列表
录制音频
- 视频在冒号之前指定,音频设备在冒号后面指定
- ffmpeg -f avfoundation -i :0 out.wav
- 播放 ffplay out.wav
![](https://i-blog.csdnimg.cn/blog_migrate/b9321e45baf2ed91fb99b56dd3179c80.png)
FFmpeg分解与复用
多媒体格式转换
- ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
- -vcodec copy v代表视频,copy表示先前封装不变,直接拷贝
- -acodec copy a代表音频,copy表示先前封装不变,直接拷贝
- out.flv 表示另外一种输出格式
FFmpeg处理原始数据
例子一 FFmpeg提取YUV数据
- ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
- -an a表示音频 n 表示不要,输出视频不包含 音频
- -c:v rawvideo 对原始视频进行编码
- -pix_fmt yuv420p 对像素格式进行处理
- 播放需要指定参数ffplay -s 638x358 out.yuv
例子二 FFmpeg提取PCM数据
- ffmpeg -i out.mp4 -vn -ar 44100 -ac2 -f s16le out.pcm
- -vn 不要视频
- -ar 44100 音频采样率
- -ac2 c表示声道 2 表示双声道
- -f s16le s表示有符号 16表示每一个数值使用16位表示 l表示小 e表示end 小端存储
- 播放指定参数 ffplay -ar 44100 -ac 2 -f s16le out.pcm
FFmpeg滤镜
- 滤镜需要针对解码数据进行操作,对其进行过滤,再次编码
![](https://i-blog.csdnimg.cn/blog_migrate/d689c9015b94b47ef0357481cb49c9be.png)
- ffmpeg -i in.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
- -vf 视频滤镜
- crop是滤镜的名字
- =in_w-200:in_h-200 是与crop相对应的参数
- in_w 视频本身的宽度,in_h视频本身的高度
- -200,即在原有的视频高度和宽度的基础上 裁剪200,实现视频的裁剪
- -c:v 视频的编码器是libx264
- -c:a copy 音频不处理 直接拷贝
FFmpeg裁剪与合并命令
- 音视频裁剪
- ffmpeg -i in.mp4 -ss 00:00:00 -t 10 out.ts
- -ss 00:00:00 裁剪的起始时间 时:分:秒
- -t 10 截取多长时间的视频,以秒为单位
- 音视频合并
- ffmpeg -f concat -i inputs,txt out,flv
- concat 拼接
- -i inputs.txt 存储想要合并的文件,也就是文件列表
- inputs.txt内容为 file filename 每一行指定一个文件
- 例子
- file '1.ts'
- file '2.ts'
- out.flv 输出结果
FFmpeg 图片和视频互转命令
- 视频转图片
- ffmpeg -i in.flv -r 1 -f image2 image-%3d.jpeg
- -r 转换图片的速率 此时设置为1,表示每秒钟转换1张图片
- -f 将输入文件 转化为什么格式的,这里是image2
- 输出结果是 image-%3d.jpeg %3d动态的递增,%3表示3个数字组成,即文件命名image-000.jpeg 开始 ,以image-999.jpeg 结束
- 图片转视频
- ffmpeg -i image-%3d.jpeg out.mp4
- 播放 ffplay out.mp4 播放视频,几张图立刻播放完毕
FFmpeg 直播 推 / 拉流
- 推流
- ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/steamName
- -re 减慢帧率
- -i out.mp4 推出去的流媒体
- -c 音视频
- -v 视频
- -a 音频
- -f 推出去流媒体的格式
- rtmp://server/live/steamName 服务器
- 拉流
- ffmpeg -i rtmp://server/live/steamName -c copy dump.flv
- -c 音视频 copy不进行编码
- dump.flv 将其转换为 flv格式
![](https://i-blog.csdnimg.cn/blog_migrate/7884b8cd0a756ee7ace20ae1a37ec939.png)
简单命令
- 修改图片和视频的分辨率
- ffmpeg -i input -vf scale=iw/2:-1 output
- iw: 输入帧宽 此处将帧宽缩短为先前的1/2
- -1: 要求scale filter保持纵横比
- ffplay 播放文件
- 播放网络文件
- ffplay rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov //大白熊
- 以json字符串的形式输出数据视频和音频流的详细信息
- ffprobe -print_format json -show_streams test.mp4
- 结果示例
chy-cpabe@ubuntu:~/ffmpeg-source/ffmpeg$ ./ffprobe -print_format json -show_streams /home/chy-cpabe/Videos/test.mp4
ffprobe version N-106797-g580fb6a8c9 Copyright (c) 2007-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/home/chy-cpabe/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/chy-cpabe/ffmpeg_build/include --extra-ldflags=-L/home/chy-cpabe/ffmpeg_build/lib --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/chy-cpabe/bin --enable-gpl --enable-gnutls --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
libavutil 57. 24.101 / 57. 24.101
libavcodec 59. 27.100 / 59. 27.100
libavformat 59. 23.100 / 59. 23.100
libavdevice 59. 6.100 / 59. 6.100
libavfilter 8. 37.100 / 8. 37.100
libswscale 6. 6.100 / 6. 6.100
libswresample 4. 6.100 / 4. 6.100
libpostproc 56. 5.100 / 56. 5.100
{
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/chy-cpabe/Videos/test.mp4':
Metadata:
major_brand : M4V
minor_version : 1
compatible_brands: isomavc1mp42
creation_time : 2021-02-14T02:11:02.000000Z
Duration: 00:00:23.36, start: 0.000000, bitrate: 6313 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 6147 kb/s, 23.98 fps, 23.98 tbr, 24k tbn (default)
Metadata:
creation_time : 2021-02-14T02:11:02.000000Z
handler_name : ETI ISO Video Media Handler
vendor_id : [0][0][0][0]
encoder : Elemental H.264
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2021-02-14T02:11:02.000000Z
handler_name : ETI ISO Audio Media Handler
vendor_id : [0][0][0][0]
"streams": [
{
"index": 0,
"codec_name": "h264",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"profile": "High",
"codec_type": "video",
"codec_tag_string": "avc1",
"codec_tag": "0x31637661",
"width": 1920,
"height": 1080,
"coded_width": 1920,
"coded_height": 1080,
"closed_captions": 0,
"film_grain": 0,
"has_b_frames": 1,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "16:9",
"pix_fmt": "yuv420p",
"level": 40,
"color_range": "tv",
"color_space": "bt709",
"color_transfer": "bt709",
"color_primaries": "bt709",
"chroma_location": "left",
"field_order": "progressive",
"refs": 1,
"is_avc": "true",
"nal_length_size": "4",
"id": "0x1",
"r_frame_rate": "24000/1001",
"avg_frame_rate": "24000/1001",
"time_base": "1/24000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 560560,
"duration": "23.356667",
"bit_rate": "6147092",
"bits_per_raw_sample": "8",
"nb_frames": "560",
"extradata_size": 60,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"creation_time": "2021-02-14T02:11:02.000000Z",
"language": "und",
"handler_name": "ETI ISO Video Media Handler",
"vendor_id": "[0][0][0][0]",
"encoder": "Elemental H.264"
}
},
{
"index": 1,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "LC",
"codec_type": "audio",
"codec_tag_string": "mp4a",
"codec_tag": "0x6134706d",
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"id": "0x2",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/48000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 1118656,
"duration": "23.305333",
"bit_rate": "160137",
"nb_frames": "1094",
"extradata_size": 2,
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"creation_time": "2021-02-14T02:11:02.000000Z",
"language": "und",
"handler_name": "ETI ISO Audio Media Handler",
"vendor_id": "[0][0][0][0]"
}
}
]
}
chy-cpabe@ubuntu:~/ffmpeg-source/ffmpeg$