ffmpeg命令行操作

心得

在使用命令行之前,我认为一些比较复杂的操作,比如像给视频加水印,直播拉流等,是必须要用源码二次开发去完成,但是在使用过程中,发现可以直接使用ffmpeg.exe配合命令行完成,而且他的滤镜库相当的多,可以玩出一些炫酷的画面。包括视频格式转换,等等,省得我再去下格式工厂这些软件来转,当然是处理些小视频,感觉大数据量的视频专业软件可以用独显去转,可能效率更高,以后再看看怎么利用独显来处理。

总的来说,感觉在平时的使用过程中,可以用ffmpeg.exe的命令行来代替直接用代码进行二次开发,写个批处理,就可以完成很多事情。

ffmpeg处理流程

流程

流程为5个部分

输入文件–demuxer–>编码数据包–decoder–>解码后数据帧–encoder->编码数据包–muxer–>输出文件

解释

  1. 输入文件(flv,mp4格式的文件)相当于一个大包,里面包含很多内容,有音频数据,视频数据,而demuxer把这些包解开,解开之后就是各种的编码数据包,再经过解码器,就得到了想要的像素数据,这些数据为原始的像素数据(rgb yuv),可以显示在屏幕上。当然这些像素数据体积非常大,有时是编码之后的数据的几百倍。

  2. 我们大部分时候对视频文件的处理,都是建立在已经解码过后的原始数据上,(编码后的数据已经被压缩了,没法处理)。

  3. 对像素数据完成处理之后,此时的数据体积是非常大的,需要压缩

  4. 将这个解码后的经过处理的数据包 再 编码压缩,再利用muxer封装成为想要的格式文件。

可以看出,最主要就是对解码之后的数据进行处理。而编码封装只是套各种各式的皮肤。

命令分类

命令比较多,大致为几类 (以前学习的时候不知道参考了哪篇文章)

  1. 基本信息查询
  2. 录制
  3. 分解/复用 对不同格式的转换
  4. 处理原始数据 对物理设备直接采集的数据进行处理
  5. 剪裁合并
  6. 图片视频相互转换
  7. 直播 推流拉流
  8. 滤镜

1基本信息查询命令

-version 版本
-demuxers 显示可用的
-muxers
-devices 显示可用设备
-codecs 可用的编解码器
-decoders
-encoders
-bsfs 显示比特流
-format 可用格式
-protocols 协议
-filters
-pix_fmts 可用的像素格式,rgb yub
-sample_fmts 采样格式,一个采样多大,浮点还是其他格式
-layouts channels 名称,双声道,单声道,立体声
-colors 颜色名称

在执行-codecs命令后显示
D… = Decoding supported
.E… = Encoding supported
…V… = Video codec
…A… = Audio codec
…S… = Subtitle codec 字幕
…I… = Intra frame-only codec 帧内编码,就是对一张图片里面的内容进行压缩,而帧间压缩就是一组图片进行压缩
…L. = Lossy compression 有损压缩
…S = Lossless compression 无损压缩

2录制命令

录屏

mac下面播放库用的是avfoundation,window下面可以用-devices命令找到gdigrab库。
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f avfoundation:指定使用avfoundation库采集数据,
-i :指定从哪采集,他是一个文件索引号
-r: 指定帧率

ffmepg -f avfoundation -list_devices true -i ""即可查看设备序号

播放录制的视频

采集好的数据可以通过ffplay进行播放,
ffplay -s 大小
然而播放的内容是花屏:
ffplay默认播放格式是yuv420p可以对比下录制时的格式.
更改播放类型为:
ffplay -s 大小 -pix_fmt uyvy422 名称
这是win下面的播放:
ffplay -s 1920x1080 -pix_fmt bgra grab.yuv

录制音频

ffmpeg -f xxx -i :0 good.wav
当然,windows下面录制视频,还需要安装一个screen-capture-recoder,下载网址:
https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases
用这个命令来查看设备:
ffmpeg -list_devices true -f dshow -i dummy
查找到很多设备,有刚才安装好的软件名称:
ffpmpeg -f dshow -i audio=“virtual-audio-capturer” output.wav
如果想录制有声音的视频可以用下面的代码
ffmpeg -f dshow -i video=“screen-capture-recorder”:audio=“virtual-audio-capturer” -pix_fmt yuv420p out.mp4

3.分解与复用

各种格式文件相互转换。

命令如下:

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\Titanic.mkv -vcodec copy -acodec copy out.flv

-i 输入文件

-vcodec copy

-acodec copy

如果单独提取出音频,

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\Titanic.mkv -vn -acodec copy out.flv

单独提取出视频就是:

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\Titanic.mkv -vcodec copy -an out.flv

4.处理原始数据

ffmpeg提取YUV数据

命令如下:

ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv

-c:v rawvideo 对视频进行编码,用原始视频格式

例子:

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\屌丝男士.mov -c:v rawvideo -pix_fmt yuv420p out.yuv

错误

用ffplay打开,结果提示

Picture size 0x0 is invalid0B f=0/0,这是因为out.yuv的输出格式为rawvideo,裸视频格式,他里面没有包含头,所以ffplay不知道他的大小是多少。

ffplay -s 640x352 out.yuv

提取pcm数据

命令:

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\屌丝男士.mov -vn -ar 44100 -ac 2 -f s16le out.pcm

-vn 不搞视频

-ar 44100 : r为read,音频采样率

-ac 2 : c代表channel,2就是双声道

-f s16le :抽取的音频 存储格式是什么 s为有符号 ,每个数值为16,le为little endian。

执行ffplay,依然报错

out.pcm: Invalid data found when processing input

ffplay不知道以什么基本信息播放该文件。

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

5.滤镜

滤镜非常多,可以去http://ffmpeg.org/ffmpeg-filters.html这个网站查看滤镜帮助

裁剪滤镜举例:

ffmpeg -i E:\ffmpeg\软件工具\工具\testvideo\屌丝男士.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4

-vf crop 视频滤镜,

对于crop滤镜,in_w本来的视频宽度,in_h本来的视频高度

in_w-200就是在原来的宽度基础上减去200

水印滤镜

ffmpeg -i input -i logo -filter_complex overlay=10:main_h-overlay_h-10 output

6.裁剪与合并命令

裁剪

ffmpeg -i input -ss 00:00:00 -t 10 out.ts

-t 要裁剪多少秒

合并

ffmpeg -f concat -i input.txt out.flv

input.txt文件里面是一个文件列表,里面记录了所有要合并的文件。

这个文件的格式为:

file ‘文件名’

比如

file ‘1.ts’
file ‘output.avi’

7.图片和视频的相互转换

视频转图片

可以多张图片做成一 个视频,或者把视频截取出来一个图片。

下面就是把

ffmpeg -i test\1.ts -r 1 -f image2 test\image-%3d.jpeg

-r 1 帧率为1

-f image2 转换为视频格式

img-%3d.jepg 的作用是文件格式为img-001.jepg img-002.jepg这些。

图片转视频

把刚才到处的图片导出为视频,但是这个视频的帧数非常低,帧数也低

ffmpeg -i test\image-%3d.jpeg pic.mp4

8直播相关的命令

直播推流

ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/流名称

-re 把帧率速度降低,好推

-c 音视频编解码

-f 推出文件格式

推到rtmp的服务器,其他客户段从这个服务器获取流

拉流

ffmpeg -i rtmp://server/live/stream -c copy xxx.mp4

我在网上找了一个湖南卫视的rtmp流(笑),先ffplay播放

ffplay rtmp://58.200.131.2:1935/livetv/hunantv

可以播放,然后式下拉流,发现成功。

当然除了rtmp,还可以播放http地址的(m3u8),央视的http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8

都是一样的道理。当然,如果拉取的是m3u8格式的,如果存成其他格式的,就容易出问题。比如我在拉成mp4格式的文件时,就大量报错,无法读取下个片段。

设想的有意思的事

去斗鱼虎牙申请个主播号,申请个房间,然后用ffmpeg ,把自己录屏的文件推流到直播房间里,看看有没有用。哈哈,不过感觉不大可能,以后有时间试试看。

猜你喜欢

转载自blog.csdn.net/qq_26144489/article/details/113487576