心得
在使用命令行之前,我认为一些比较复杂的操作,比如像给视频加水印,直播拉流等,是必须要用源码二次开发去完成,但是在使用过程中,发现可以直接使用ffmpeg.exe配合命令行完成,而且他的滤镜库相当的多,可以玩出一些炫酷的画面。包括视频格式转换,等等,省得我再去下格式工厂这些软件来转,当然是处理些小视频,感觉大数据量的视频专业软件可以用独显去转,可能效率更高,以后再看看怎么利用独显来处理。
总的来说,感觉在平时的使用过程中,可以用ffmpeg.exe的命令行来代替直接用代码进行二次开发,写个批处理,就可以完成很多事情。
ffmpeg处理流程
流程
流程为5个部分
输入文件–demuxer–>编码数据包–decoder–>解码后数据帧–encoder->编码数据包–muxer–>输出文件
解释
-
输入文件(flv,mp4格式的文件)相当于一个大包,里面包含很多内容,有音频数据,视频数据,而demuxer把这些包解开,解开之后就是各种的编码数据包,再经过解码器,就得到了想要的像素数据,这些数据为原始的像素数据(rgb yuv),可以显示在屏幕上。当然这些像素数据体积非常大,有时是编码之后的数据的几百倍。
-
我们大部分时候对视频文件的处理,都是建立在已经解码过后的原始数据上,(编码后的数据已经被压缩了,没法处理)。
-
对像素数据完成处理之后,此时的数据体积是非常大的,需要压缩
-
将这个解码后的经过处理的数据包 再 编码压缩,再利用muxer封装成为想要的格式文件。
可以看出,最主要就是对解码之后的数据进行处理。而编码封装只是套各种各式的皮肤。
命令分类
命令比较多,大致为几类 (以前学习的时候不知道参考了哪篇文章)
- 基本信息查询
- 录制
- 分解/复用 对不同格式的转换
- 处理原始数据 对物理设备直接采集的数据进行处理
- 剪裁合并
- 图片视频相互转换
- 直播 推流拉流
- 滤镜
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 ,把自己录屏的文件推流到直播房间里,看看有没有用。哈哈,不过感觉不大可能,以后有时间试试看。