由于最近要将yuv视频下采样,于是使用ffmpeg快速将yuv视频下降分辨率。在此记录ffmpeg的基础使用方法和所遇到的问题:
可到官网下载:https://www.ffmpeg.org/ 在这推荐一篇博客:https://www.cnblogs.com/liusx0303/p/7572050.html 里面详细的介绍了安装流程。
操作方法一:下载安装完成之后,新建自己的工作目录。其次将所要降低分辨率的视频放入工作目录中。然后要使用cmd进入你的工作目录,写入命令: cd 加上你的工作目录地址。最后就可以输入降低分辨率的命令:ffmpeg -s 原始视频的size -i 输入视频名字及格式 -vf scale=1920:1080(这里是所要的分辨率), setsar=1:1 输出视频的名字及格式 -hide_banner
例如:ffmpeg -s 3840x1920 -i AerialCity_3840x1920_30fps_8bit_420_erp.yuv -vf scale=1920:1080,setsar=1:1 AerialCity_1920x1080.yuv -hide_banner
操作方法二:如果要批量处理,则在工作目录下写一个.bat文件。然后在.bat文件编辑中批量写入以上的命令直接执行即可。
FFmpeg官方文档网址
引用雷神的博客
编解码器的使用:
1、查看编解码器 ffmpeg -codecs
2、1080p分辨率常用的编解码器
MP4封装:H264视频编码+AAC音频编码 (一般使用这种)
谷歌的方案(Youtube)WebM封装:VP8视频编码+Vorbis音频编码 (性能相比上面的更不好)
OGG封装:Theora视频编码+Vorbis音频编码 (完全开源,谷歌以此为基础)
ffmpeg -i Music.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
ffmpeg -i Music.flac(输入音频)
-acodec(a:aoto音频缩写,指定音频编解码器)
libmp3lame(mp3的编码器,这里可以不写,结果会自动采用相应编码器进行操作) -ar 44100(设置音频采样率,一般使用48kHz和44.1kHz)
-ab 320k(设置比特率,默认128k) -ac 2(设置声道数目,1是单声道,2是双声道) out.mp3(输出文件)
ffmpeg -i input.webm -s 1920x1080 -pix_fmt yuv420p -vcodec libx264 -proset medium -profile:v high -level:v 4:1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k out.mp4
-s 1920x1080(后面是缩放后的视频分辨率)
-pix_fmt yuv420p(pixel format:设置生成视频的颜色通道:yuv NV RGB 可使用ffmpeg -pix_fmts查询相关)
-vcodec libx264 (选择设置视频编码器的指令)
-proset medium (编码器预设,对编码器工作性能的设定,等级越高性能越好:ultrafast superfast veryfast faster fast medium slow slower veryslow placebo 默认是medium 录制视频使用veryfast)
-profile:v high (视频压缩比:Baseline Extended Main High high10 high 4:2:2 high 4:4:4 从左到右视频性能越高 实时通信领域一般采用baseline 流媒体使用main 超清使用high)
-level:v 4:1 (编码器配置的具体规范和限制,压缩比和画质之间做出权衡 由1到5.2 1080p使用4.1)
-crf 23 (设置码率控制 使用crf固定码率因子方式,每帧的码率固定,画质均衡,无法控制生成视频码率和文件大小 这里的数值是QP)
-r 30 (帧率)
-b:a 128k (等同-ab设置音频比特数 ffmpeg推荐-b:a写法,现在一般设定为128k或者192k)
ffmpeg支持 -qp -crf -b 一般都搭配-perset veryslow 使得参数更精准
ffmpeg -i input -vcodec libx264 -preset ultrafast --qp 0 output (无损压缩 快速编码)
ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output (无损压缩 高压缩比)
一个浮动QP范围的模式 将每帧给予不同的QP 让某些画面的质量高点或者低点(利用人眼感受不出来细节变化)降低人眼不敏感的码率 提升敏感的区域码率
QP范围可设置,一般采用这种方式编码
编码器尝试生成视频码率与我们给定的码率相同 适用于视频大小和码率限定的情况
默认采用VBR(Variable Bit Rate/动态比特率):简单内容少给码率,复杂内容多给
ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3000k output
一般采用ABR(Average Bit Rate/平均比特率):
ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3000k output
CBR(Constant Bit Rate/恒定比特率):让码率固定在某个数值
ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3000k -minrate 4000k -maxrate 4000k -bufsize 1835k output
ffmpeg -i input.mp4 -vcodec copy -an v.mp4
-an 静音指令
ffmpeg -i input.mp4 -vn -acodec copy a.m4a
-vn 去除画面指令
Stream #0:2[0x81]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:3[0x82]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:4[0x80]:Audio:ac3,48000Hz,5.1,s16,448kb/s
如果要提取Stream #0:3的音频,则要加上指令:-map 0:3
若从同一个视频提取出的视频和音频没有改动编码格式 可直接使用copy指令将两个文件合并
ffmpeg -i v.mp4 -i a.m4a -c copy out.mp4
若需要修改
ffmpeg -i Music.mp3 -ss 00:00:00 -to 00:00:12 -acodec copy out.mp3
-ss 原始时间(时:分:秒 / 分:秒) -to 结束时间
-ss 原始时间 -t 持续时间
-sseof 从后面开始 -t 持续时间
ffmpeg -i input.mp4 -ss 00:00:00 -to 00:00:12 -acodec copy out.mp4
加速操作 但是截取出来的视频的起始时间和结束时间不一定准确
ffmpeg -ss 00:00:00 -i input.mp4 -to 00:00:12 -acodec copy out.mp4
再加上-copyts(增加保留时间戳)就不会出错
ffmpeg -ss 00:00:00 -i input.mp4 -to 00:00:12 -acodec copy -copyts out.mp4
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4 concat:(concatenate 串联)
ffmpeg -ss 00:00:00 -i 蔡徐坤.flv -to 00:00:12 -acodec copy -copyts out1.mp4
若参数不一致可使用Avidemux软件(基于ffmpeg)
ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg 截取视频第5秒第一帧的画面
ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20" out.mp4
-i logo.png 输入图片
-filter_complex 插入滤镜
"overlay=20:20" 设置图片位置,这里表示距离视频左边和上边20个像素位置
ffmpeg -i in.mp4 -ss 7.5 -to 8.5 -s 640x320 -r 15 out.gif
ffmpeg -f gdigrab -i desktop rec.mp4
这里的gdigrab是组件用来获取视频设备,只能捕获视频,不能录取音频,需要后期人为添加音频
这里可以使用Screen Capture Recorder组件
或者使用OBS Studio软件(开源)
ffmpeg -re -i rec.mp4 按照网站要求编码 -f flv "你的rtmp地址/你的直播码"
-re 按照帧率进行推流
-f flv 指定格式
"你的rtmp地址/你的直播码" 指定格式
ffplay INPUT
ffplay INPUT -loop 10 // 循环播放 10 次
ffplay INPUT -ast 1 // 播放视频中的第一路音频流
ffplay INPUT -vst 1 // 播放视频中的第一路视频流
ffplay INPUT -x WIDTH -y HEIGHT // 指定宽高播放
...
ffprobe INPUT
ffprobe -show_format INPUT 用于查看文件格式、时长、码率等信息,较为简略
ffprobe -show_streams INPUT 用于查看视频流、音频流的信息,包括编码器、帧率、采样率、宽高、像素格式、采样格式、码率、时长、总帧率等等,较为详细,是最常用的一个功能;
show_frames、show_packets用于查看每一帧(解码前/解码后)的信息,可以配合 select_streams 使用
ffprobe -show_frames INPUT
ffprobe -show_packets INPUT
...