FFmpeg视频处理使用总结

目的:对使用ffmpeg过程中遇到的问题及处理进行记录

变量声明:

  • videoPath:视频的绝对路径,使用时替换即可,注意路径分隔符为单斜杠
  • inputVideo:输入视频名称,包含绝对路径,路径分隔符为单斜杠
  • inputImage:输入图片名称,包含绝对路径,路径分隔符为单斜杠
  • outputVideo:输出视频名称,包含绝对路径,路径分隔符为单斜杠
  • screenshot_time:视频快照截取时间,单位为秒,可是为小数
  • outPath:快照截取后的输出图片名称,包含绝对路径
  • loction_str:水印在视频的位置信息
  • level:压缩的阈值

一、获取视频基础信息

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视频处理使用总结_第1张图片

如上图所示 ,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视频处理使用总结_第2张图片

四、修改视频图片分辨率

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、视频拼接:

  • 视频格式:则最好先将视频格式转换为mpg格式的视频后再进行拼接,否则可能出现流相关的错误异常导致处理流程中断
  • 分辨率:拼接视频的分辨率必须是一致的,否则会导致编码异常,导致处理流程中断
  • 视频旋转问题:部分视频自带旋转属性,但是如果在拼接之前对该视频进行一次h264编码,就有可能会丢失源视频的旋转属性,此时获得的分辨率和源视频分辨率是完全不同的,如果忽略这个问题,就可能导致后面的视频拼接过程中,因为分辨率不同而导致编码异常。

4、GPU编码加速:博主只是用了GPU进行编码加速,具体的处理就是将编码器替换,替换成“h264_nvenc”

​​​​​​​(后续如果还遇到相关问题,会继续更新此博文)

 

你可能感兴趣的:(总结,学习,工具)