### 学习笔记
FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。下面主要记录如何使用它提供的工具,在Windows10系统中应用,目前采用的版本4.1。
FFMPEG 目录及作用
- libavcodec: 提供了一系列编码器的实现。
- libavformat: 实现在流协议,容器格式及基本IO访问。
- libavutil: 包括了hash器,解码器和各类工具函数。
- libavfilter: 提供了各种音视频过滤器。
- libavdevice: 提供了访问捕获设备和回放设备的接口。
- libswresample: 实现了混音和重采样。
- libswscale: 实现了色彩转换和缩放工能。
主要处理流程:
输入音视频文件(mp4/ ts / mov等)封装好的文件,解封装(demuxer)成为一个数据包,即把视频文件和音频文件从盒子里拿出来,再按照需要分别解码(decoder),成为一帧帧的数据(frames),对数据进行需要的处理,然后编码(encoder)成为数据包,即音频文件和视频文件,再封装(muxer),即把音频文件和视频文件放进一个盒子里,输出音视频文件。
如果只是把mp4 转成 ts 格式,则不需要进行decoder和encoder,直接对数据包进行操作。
基本查询命令
|
参数 |
说明 |
|
-version |
显示版本。 |
|
-formats |
显示可用的格式(包括设备)。 |
|
-demuxers |
显示可用的demuxers。 |
|
-muxers |
显示可用的muxers。 |
|
-devices |
显示可用的设备。 |
|
-codecs |
显示libavcodec已知的所有编解码器。 |
|
-decoders |
显示可用的解码器。 |
|
-encoders |
显示所有可用的编码器。 |
|
-bsfs |
显示可用的比特流filter。 |
|
-protocols |
显示可用的协议。 |
|
-filters |
显示可用的libavfilter过滤器。 |
|
-pix_fmts |
显示可用的像素格式。 |
|
-sample_fmts |
显示可用的采样格式。 |
|
-layouts |
显示channel名称和标准channel布局。 |
|
-colors |
显示识别的颜色名称。 |
命令基本格式及参数
主要参数
|
参数 |
说明 |
|
-f fmt(输入/输出) |
强制输入或输出文件格式。 格式通常是自动检测输入文件,并从输出文件的文件扩展名中猜测出来,所以在大多数情况下这个选项是不需要的。-f dshow 用到。 |
|
-i url(输入) |
输入文件的网址或地址 |
|
-c [:stream_specifier] codec(输入/输出,每个流) |
选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流。codec 是解码器/编码器的名称或 copy(仅输出)以指示该流不被重新编码。如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT // 对视频流编码,对音频流直接复用 |
|
-codec [:stream_specifier]编解码器(输入/输出,每个流) |
同 -c |
|
-t duration(输入/输出)单位:秒 |
当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。当用作输出选项时(在输出url之前),在持续时间到达持续时间之后停止输出。 |
|
-ss位置(输入/输出)00:00:00(时分秒) |
当用作输入选项时(在-i之前),在这个输入文件中寻找位置。 请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点。 当转码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外的分段将被解码和丢弃。 当进行流式复制或使用-noaccurate_seek时,它将被保留。当用作输出选项(在输出url之前)时,解码但丢弃输入,直到时间戳到达位置。 |
|
-frames [:stream_specifier] framecount(output,per-stream) |
停止在帧计数帧之后写入流。 |
|
-filter [:stream_specifier] filtergraph(output,per-stream) |
创建由filtergraph指定的过滤器图,并使用它来过滤流。filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出。在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联。有关filtergraph语法的更多信息,请参阅ffmpeg-filters手册。 |
视频参数
|
参数 |
说明 |
|
-vframes num(输出) |
设置要输出的视频帧的数量。对于-frames:v,这是一个过时的别名,您应该使用它。 |
|
-r [:stream_specifier] fps(输入/输出,每个流) |
设置帧率(Hz值,分数或缩写)。作为输入选项,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳。这与用于-framerate选项不同(它在FFmpeg的旧版本中使用的是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。作为输出选项,复制或丢弃输入帧以实现恒定输出帧频fps。 |
|
-s [:stream_specifier]大小(输入/输出,每个流) |
设置窗口大小。作为输入选项,这是video_size专用选项的快捷方式,由某些分帧器识别,其帧尺寸未被存储在文件中。作为输出选项,这会将缩放视频过滤器插入到相应过滤器图形的末尾。请直接使用比例过滤器将其插入到开头或其他地方。格式是'wxh'(默认 - 与源相同)。 |
|
-aspect [:stream_specifier] 宽高比(输出,每个流) |
设置方面指定的视频显示宽高比。aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。如果与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。 |
|
-vcodec编解码器(输出) |
设置视频编解码器。这是-codec:v的别名。 |
|
-vf filtergraph(输出) |
创建由filtergraph指定的过滤器图,并使用它来过滤流。 |
音频参数
|
参数 |
说明 |
|
-aframes(输出) |
设置要输出的音频帧的数量。这是-frames:a的一个过时的别名。 |
|
-ar [:stream_specifier] freq(输入/输出,每个流) |
设置音频采样频率。对于输出流,它默认设置为相应输入流的频率。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。 |
|
-ac [:stream_specifier]通道(输入/输出,每个流) |
设置音频通道的数量。对于输出流,它默认设置为输入音频通道的数量。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。 |
|
-an(输出) |
禁用录音。n 表示不需要。 |
|
-acodec编解码器(输入/输出) |
设置音频编解码器。这是-acodec的别名:a。 |
|
-sample_fmt [:stream_specifier] sample_fmt(输出,每个流) |
设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。 |
|
-af filtergraph(输出) |
创建由filtergraph指定的过滤器图,并使用它来过滤流。 |
录制视频、音频
// 列出设备,查看有哪些音频采集设备(麦克风等),视频采集设备(摄像头等)
ffmpeg -list_devices true -f dshow -i dummy
1. 录屏
// 这里安装了screen_capture;编码器采用H264; -r 30, 帧率为30;输出mp4. 录制的视频中鼠标有点错位???
ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec h264 -r 30 screen.mp4
ffmpeg -f dshow -i video="screen-capture-recorder" -r 30 out.yuv // 录制yuv文件,未压缩,特别大,慎用。
2. 录制摄像头
ffmpeg -f dshow -i video="Integrated Camera" -vcodec h264 -r 30 camera.mp4
3. 录制声音
ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.wav // vitual-audio-capturer采集不到声音
ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" a-out.wav // 可以采集到声音
//-profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
// -b:a 指定音频码率。 b 是 bitrate的缩写, a是 audio的缩写。
ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" -profile:a aac_he_v2 -b:a 32k aout.mp3
// 录制音频未编码数据
ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" -ar 44100 -f s16le out.pcm
4、摄像头+录音
// video与audio中间用冒号隔开,只对video指定了编码、帧率,audio会根据输出文件的格式,设置编码格式参数等。
//(仅用VLC播放)比较好的一点是,音视频比较同步
ffmpeg -f dshow -i video="Integrated Camera":audio="麦克风阵列 (Conexant SmartAudio HD)" -vcodec libx264 -r 30 av-out.mp4
5、录屏+录音
ffmpeg -f dshow -i video="screen-capture-recorder":audio="麦克风阵列 (Conexant SmartAudio HD)" -vcodec libx264 -r 30 av-out.mp4 // 录制的视频中鼠标有点错位,相差1cm左右???比较好的一点是,音视频比较同步
简单说明:
- -f 指定使用 dshow 采集数据
- -i 指定从哪儿采集数据
- -r 指定帧率。按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。-framerate优选。
分解与复用
1. 抽取音频流
// 从ts中,抽取出音频文件
ffmpeg -i Titanic.ts -acodec copy -vn out.mp3
- acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
- vn: v 代表视频,n 代表 no 也就是无视频的意思。
2. 抽取视频流
// 从ts中,抽取出视频文件
ffmpeg -i Titanic.ts -vcodec copy -an out.h264
- vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
- an: a 代表视频,n 代表 no 也就是无音频的意思。
3. 音视频合并
ffmpeg -i out.h264 -i out.mp3 -vcodec copy -acodec copy new.mp4
4. 转格式
ffmpeg -i Titanic.ts -vcodec copy -acodec copy Titanic.mp4
5. 提取YUV数据
ffmpeg -i Titanic.mp4 -an -c:v rawvideo -pixel_format yuv420 out.yuv
- -c:v rawvideo 指定将视频转成原始数据
- -pixel_format yuv420 指定转换格式为yuv420
6. YUV转H264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 640x272 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264
7. 提取PCM数据
ffmpeg -i Titanic.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
8. PCM转WAV
ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i out.pcm output.wav