目的:对使用ffmpeg过程中遇到的问题及处理进行记录
变量声明:
1、获取基础信息
ffprobe -v quiet -print_format json -show_format -show_stream videoPath
效果:将视频的基础信息及流信息以json的格式打印出来,其中,“format”的json字符串是视频的一些基础信息,包括视频名称(filename)、播放时长(duration,单位:s)、大小(size,注意,单位是字节byte)、格式、码率(bit_rate,视频压缩的重要指标)以及开始时间(start_time)等;“streams”的json数组包含视频流信息和音频流信息,index为0的是视频流信息,包含编码格式(codec_name,常见的视频格式的编码基本为“h264”)、分辨率(width、height)、视频流播放时长(duration,单位:s)、码率等,index为1的是音频流信息,包括编码格式(codec_name)、播放时长(duration)、播放开始时间(start_time)等;
2、获取旋转信息
ffmpeg -i videoPath
效果:此命令是错误命令,但是会在控制台打印出视频的旋转角度,这个属性在后期进行片尾融合的时候会尤其重要,重要性会在添加片尾的部分描述,此处先做效果的简要介绍:
如上图所示 ,ffmpeg是需要明确指定输出的,所以ffmpeg会提示需要指定输出,但是此处可以忽略,该命令的价值在于在Metadata中的rotate属性,这个属性是指视频的按顺时针方向旋转了多少度,当这个属性的值随播放时间变化的时候,视频画面就会按照一定的旋转速度进行旋转,还是很有意思的,此处不再多做描述。
ffmpeg -i videoPath -f image2 -t screenshot_time outPath
效果:在播放时间的screenshot_time秒截取视频快照,以image2的格式输出截取的图片。
ffmpeg -i inputVideo -vcodec h264 outputVideo -y
效果:使用h264编码器,将视频从inputVideo的格式转换为outputVideo的格式并输出为outputVideo。其中,“-vcodec h264”是指定格式转换的过程中使用h264的编码器,“-y”是直接覆盖之前生成的,避免如下图的提示。
ffmpeg -i inputVideo -s width*height -vcodec h264 outputVideo -y
效果:使用h264编码器,将视频修改成宽为width、高为height的视频,并且覆盖输出
ffmpeg -i inputVideo -i inputImage -filter_complex location_str -vcodec 264 outputVideo -y
location_str的值:
左上角-->10:10
右上角-->main_w-overlay_w-10:10
左下角-->10:main_h-overlay_h-10
右下角-->main_w-overlay_w-10:main_h-overlay_h-10
底部居中-->(main_w-overlay_w)/2:main_h-overlay_h:1
效果:使用h264编码器,将水印图片inputImage添加到视频inputVideo的location_str方位,其中,location_str是指定水印在视频的位置
1、先生成一个需要合并的视频列表文件,文件名称随意(eg:list.txt),内容有格式要求,内容格式为:
file inputVideo1
file inputVideo2
...
注意:file关键字与inputVideo中间是有空格的(理论上是可以添加任意数量的视频进行拼接的,文件中的视频顺序就是拼接顺序)
2、添加片尾,实质就时进行视频拼接
ffmpeg -f cancat -safe 0 -i list.txt -vcodec h264 outputVideo -y
效果:使用h264编码器,将list.txt中的视频拼接到一起(包含音频),其中,“-f concat”是进行拼接的关键字,“-safe 0”是标记文件安全检查的级别为0,即不考虑安全因素。list.txt中的视频的分辨率都必须是统一的,而且格式也尽量统一为mpg格式的,不然在进行视频拼接的时候会报错。即在视频拼接前,先需要对视频素材进行处理。博主遇到的视频拼接的坑,会在总结中列出。
ffmpeg -i inputVideo -vcodec h264 -crf level outputVideo -y
level的值:量化比例的范围为0~51,其中0为无损模式,23为缺省值,51可能是最差的。
效果:使用h264编码器,将视频进行压缩,并覆盖输出。其中,“-crf”是h264编码器的一个参数,这个参数可以直接控制输出视频的码率大小,即可以控制输出视频的大小,进而达到视频压缩的目的。level数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。若Crf值加6,输出码率大概减少一半;若Crf值减6,输出码率翻倍。通常是在保证可接受视频质量的前提下选择一个最大的Crf值,如果输出视频质量很好,那就尝试一个更大的值,如果看起来很糟,那就尝试一个小一点值。
1、覆盖输出:如果带输出的命令,最好直接在命令后面加上“-y”,进行覆盖输出,不然进程会一直等待,导致处理过程中断
2、视频处理:尽量选择h264编码器进行解码和再编码,目前市面上的主流格式视频的编码格式基本都可以用h264进行编解码
3、视频拼接:
4、GPU编码加速:博主只是用了GPU进行编码加速,具体的处理就是将编码器替换,替换成“h264_nvenc”
(后续如果还遇到相关问题,会继续更新此博文)