使用FFMPEG降低YUV视频分辨率(下采样)及FFMPEG相关操作详解

目录

  • 一、下采样
    • 1、下载FFmpeg
    • 2、分辨率下降操作
    • 3、在这说明下所遇到的问题:yuv视频是无格式参数的,故在yuv输入文件之前就需要设置视频的大小。所以写入 3840x1920
    • 4、具体操作和结果如下图:
  • 二、FFmpeg.exe使用
    • 将flac格式的音频文件转为MP3格式
    • 将webm格式的视频文件转为MP4格式
    • 码率控制:
      • -qp(Constant Quantizer)QP设定范围:0-51 0表示无损压缩
      • -crf(constant Rate Factor)
      • -b(bitrate)固定目标码率模式
    • 单独提取视频指令:
    • 单独提取音频指令:
    • 有些视频有多个音频流,要提取音频只能一一对应去取
    • 合并音视频文件:
    • 原音视频截取部分音视频:
    • 连接多个视频:参数一致(宽、高、编码格式、码率)
    • 截屏:
    • 添加水印:
    • 制作动图:
    • 屏幕录制:
    • 推流:
  • 三、FFplay.exe使用 播放音视频
  • 四、FFprobe.exe使用 查看媒体文件头信息

由于最近要将yuv视频下采样,于是使用ffmpeg快速将yuv视频下降分辨率。在此记录ffmpeg的基础使用方法和所遇到的问题:

一、下采样

1、下载FFmpeg

可到官网下载:https://www.ffmpeg.org/ 在这推荐一篇博客:https://www.cnblogs.com/liusx0303/p/7572050.html 里面详细的介绍了安装流程。

2、分辨率下降操作

操作方法一:下载安装完成之后,新建自己的工作目录。其次将所要降低分辨率的视频放入工作目录中。然后要使用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文件编辑中批量写入以上的命令直接执行即可。

3、在这说明下所遇到的问题:yuv视频是无格式参数的,故在yuv输入文件之前就需要设置视频的大小。所以写入 3840x1920

4、具体操作和结果如下图:

使用FFMPEG降低YUV视频分辨率(下采样)及FFMPEG相关操作详解_第1张图片

二、FFmpeg.exe使用

FFmpeg官方文档网址
引用雷神的博客

编解码器的使用:
1、查看编解码器 ffmpeg -codecs
2、1080p分辨率常用的编解码器
MP4封装:H264视频编码+AAC音频编码 (一般使用这种)
谷歌的方案(Youtube)WebM封装:VP8视频编码+Vorbis音频编码 (性能相比上面的更不好)
OGG封装:Theora视频编码+Vorbis音频编码 (完全开源,谷歌以此为基础)

将flac格式的音频文件转为MP3格式

	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(输出文件)

将webm格式的视频文件转为MP4格式

	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 使得参数更精准

-qp(Constant Quantizer)QP设定范围:0-51 0表示无损压缩

		ffmpeg -i input -vcodec libx264 -preset ultrafast --qp 0 output	(无损压缩 快速编码)
		ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output	(无损压缩 高压缩比)

-crf(constant Rate Factor)

一个浮动QP范围的模式 将每帧给予不同的QP 让某些画面的质量高点或者低点(利用人眼感受不出来细节变化)降低人眼不敏感的码率 提升敏感的区域码率
QP范围可设置,一般采用这种方式编码

-b(bitrate)固定目标码率模式

编码器尝试生成视频码率与我们给定的码率相同 适用于视频大小和码率限定的情况

		默认采用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.exe使用 播放音视频

	ffplay INPUT
	ffplay INPUT -loop 10 // 循环播放 10 次
	ffplay INPUT -ast 1 // 播放视频中的第一路音频流
	ffplay INPUT -vst 1 // 播放视频中的第一路视频流
	ffplay INPUT -x WIDTH -y HEIGHT // 指定宽高播放
	...

四、FFprobe.exe使用 查看媒体文件头信息

	ffprobe INPUT
	ffprobe -show_format INPUT	用于查看文件格式、时长、码率等信息,较为简略
	ffprobe -show_streams INPUT	用于查看视频流、音频流的信息,包括编码器、帧率、采样率、宽高、像素格式、采样格式、码率、时长、总帧率等等,较为详细,是最常用的一个功能;
	
	show_frames、show_packets用于查看每一帧(解码前/解码后)的信息,可以配合 select_streams 使用
	ffprobe -show_frames INPUT	
	ffprobe -show_packets INPUT
	...

你可能感兴趣的:(视频编码基础知识)