[FFmpeg开发]常用命令合集

FFmpeg常用命令分类:

  • 基本信息查询
  • 录制
  • 分解/复用
  • 裁剪与合并
  • 图片/视频互转
  • 直播
  • 处理原始数据
  • 滤镜

一. 基本信息查询命令

[FFmpeg开发]常用命令合集_第1张图片
FFmpeg基本信息查询命令

二. 录制命令

FFmpeg录屏命令:

ffmpeg -f avfoundation -i 1 -r 30  out.yuv

-f avfoundation: 指定使用avfoundation采集数据
-i: 指定从哪儿采集数据,它是一个文件索引号,1代表是从屏幕采集
-r: 指定帧率
out.yuv表示以yuv格式输出
所以,上面的指令意思是:使用avfoundation以每秒30的帧率从屏幕采集视频。

输入上面指令后,就开始录制了,可以使用ctrl+c取消录制,再通过以下指令播放录制的视频:

ffplay out.yuv

结果报错:

Picture size 0x0 is invalid
out.yuv: Invalid argument
[FFmpeg开发]常用命令合集_第2张图片

这是因为yuv原始数据没有宽高,要指定分辨率,从录制日志中可以查到:


所以播放指令变成:

ffplay -s 4096x2304 out.yuv

但是播放时出现了以下花屏的情况:

这是因为ffplay默认使用的像素格式是yuv420p:


而我们录制屏幕采用的像素格式是uyvy422:


像素格式不一致导致了无法正确渲染,所以需要另外指定录制时的像素格式。

ffplay -s 4096x2304 -pix_fmt uyvy422 out.yuv

指令输入后就能正常播放刚刚录制的屏幕视频了。

上面说了i是设备索引号,1代表的是从屏幕采集,实际上我们可以通过命令去列出设备索引号:

ffmpeg -f avfoundation -list_devices true -I ""
[FFmpeg开发]常用命令合集_第3张图片

上面列出了我的电脑上的视频设备和音频设备,前面的数字就是索引号。可以看到视频、音频索引号都有0、1,那怎么区分呢,也很简单,录制音频指令,索引号放到冒号后边,如下:

ffmpeg -f avfoundation -i :0 out.wav

:0就代表音频设备:Built-in Microphone内置麦克风

录制结束也是ctrl+c。再通过以下指令来播放刚刚录制的音频:

ffplay out.wav

这样音频的录制与播放就完成了。

三. 分解与复用命令

FFmpeg分解与复用主要是文件格式的转换,以及分解出音频、视频文件等等。

  1. 比如,多媒体格式转换,将一个mp4文件转成flv格式:
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv

-i out.mp4:输入一个名叫out的mp4文件。
-vcodec copy:视频编码处理方式。
-acodec copy:音频编码处理方式。

  1. 单独抽取音频流或视频流。
    如果只是想抽取视频流,可以用以下命令:
ffmpeg -i out.mp4 -an -vcodec copy out.h264

-an:不要音频。
同理,只抽取音频流:

ffmpeg -i out.mp4 -acodec copy -vn out.aac

四. 处理原始数据命令

所谓原始数据,就是FFmpeg解码后的数据。

  1. 提取视频原始数据。
ffmpeg -i out.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv

-c:v:对视频进行编码。
rawvideo:编码格式按原来的格式。
pix_fmt yuv420p:像素格式是yuv420p。

note: 播放yuv格式的视频,要指定分辨率,如

ffplay -s 4096x2304 out.yuv
  1. 提取音频PCM原始数据。
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

-ar:音频采样率,常用的有48k、32k、16k等等。
-ac:音频声道,包括单声道、双声道、立体声、环绕立体声等等,上面-ac2是双声道。
-f s16le: 存储格式,s16是有符号16位来表示每个数值,le是little,它是一种存储方式。

然后播放提取的音频:

ffplay out.pcm

发现报错:



这是因为播放pcm原始音频数据并不知道采样率、声道这些信息,所以需要直接指定:

ffplay -ar 44100 -ac 2 -f s16le out.pcm

五. 滤镜命令

滤镜处理,比如加水印、去水印、画中画、视频裁剪、音频倍速等等,都可以通过滤镜命令实现。

滤镜处理是对解码后的原始数据帧进行处理,那解码后的数据如何得到呢,这就要先了解FFmpeg对音视频文件处理的流程:

[FFmpeg开发]常用命令合集_第4张图片
  • 输入文件是一些具有封装格式的文件,经过demuxer分解解封装后,就得到了音频、视频等编码压缩数据。
  • 将这些编码数据包进行解码decoder,解码后就得到原始数据帧。
  • 再将解码后数据帧编码压缩成我们想要的大小,比如调整分辨率,720缩小变成480P的。
  • 重新muxer封装编码后的数据包成流行的格式并输出播放。

上面流程是一个完整的流程,其中得到的解码数据,如果进行滤镜处理,就要再经过下面的流程:

滤镜处理流程

解码后数据帧,经过滤镜程序过滤filter,得到过滤后的数据帧,再重新编码。

  1. 视频画面大小裁剪
ffmpeg -i water.mp4 -vf crop=in_w-300:in_h-150 -c:v libx264 -c:a copy out.mp4

-vf: 视频滤镜类型,-af就是音频滤镜类型。
crop=in_w-300:in_h-150:crop是滤镜名,等号后跟的是参数,本身视频的宽高上减去一定的值。
-c:v libx264:视频编码器是libx264。
-c:a copy:音频编码器是copy原来的,不作特殊处理。

note: 要先cd到原视频文件的目录下,再执行上面的命令。

六. 裁剪与合并命令

  1. 时长裁剪
ffmpeg -i water.mp4 -ss 00:00:00 -t 5 out.ts

-ss:裁剪起始时间
-t:总时长

  1. 多个视频片段进行合并
ffmpeg -f concat -i myInputsFile.txt out.mp4

-f concat:合并指令。
-i myInputsFile.txt:这里的myInputsFile.txt中存放的是多媒体文件列表,该txt文件中内容的格式是file filename,如下:

[FFmpeg开发]常用命令合集_第5张图片

out.ts和out1.ts是本地两个视频文件,当然在合并时,要cd到当前要合并的视频文件目录下。

当然其他视频格式也可以合并,比如将两个mp4格式的视频合并,只需将文件名以上面的格式放到txt文件中即可。

七. 图片与视频互转命令

  1. 视频转图片
ffmpeg -i water.mp4 -r 1 -f image2 image-%3d.jpeg

-r:帧率,上面是以每秒1帧转出图片。
-f:转出格式,上面是image格式的,image2就是该格式的第二版。
image-%3d.jpeg:输出文件名,前缀是image,在加上3个数字的文件名。

  1. 图片转视频
ffmpeg -i image-%3d.jpeg imageVideo.mp4

将上面前缀为image的一组图片转成视频。

八. 直播推拉流命令

  1. 直播推流
ffmpeg -re -i water.mp4 -c copy -f flv rtmp://server/live/streamName

-re: 减慢帧率速度,本地音视频文件是以尽可能快的速度进行播放,加上re是为了让直播流尽可能与真实的帧率保持一致。
-c: 编解码方式,-ac是音频,-vc是视频。上面是copy,不作处理。
-f flv:推出文件格式。
rtmp://server/live/streamName:服务器地址。

  1. 直播拉流
ffmpeg -i rtmp://server/live/streamName -c copy myLive.flv

现在应用实战一下,比如我们先从湖南卫视直播源rtmp://58.200.131.2:1935/livetv/hunantv拉流,并保存到本地。

ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -c copy hunanTV.flv

ctrl + c,取消拉流保存到本地,现在播放一下保存的hunanTV.flv视频文件是可以播放的。
当然,也可以拉其他协议的视频流,下面是一些视频流的地址,可以换到上面试一下。

RTSP协议直播源

  • 大熊兔(点播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

HTTP协议直播源

  • CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
  • CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8

比如拉取CCTV3高清:

ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8 -c copy cctv3.m3u8

note:注意保存格式,拉取的是m3u8格式,所以存的也要是m3u8格式的。

你可能感兴趣的:([FFmpeg开发]常用命令合集)