项目开发中,测试人员反应存在部分视频无法正常播放,赶紧去查看什么原因:发现有些视频只有声音没有影像,但是这些视频下载到本地是可以正常播放的,此时脑海中就大概知道了什么问题:应该是视频本身编码的问题,于是就去查看视频编码「可以正常播放的视频编码为
H.264
,有声音无影像的视频编码为HEVC
」
可以正常播放视频编码
有声音无影像的视频编码
为了验证这个想法的准确性,先使用工具将视频编码转为H.264,再上传,果然可以正常播放
问题找到了,开始解决吧,实际中也不可能让用户自己去转视频编码后再来上传吧,所以就在程序中对上传的视频进行转码操作(注意:视频较大的时候转码相对也比较慢,建议使用异步
、队列
来执行相关操作)
我是使用
FFmpeg
来处理视频的,下面是简单的介绍
如果你还没安装,可以根据官方文档 先完成安装。
说明
ffmpeg
是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中获取。它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。
ffmpeg从该选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)中读取-i
,并写入任意数量的由以下选项指定 的输出“文件”一个普通的输出网址。在命令行上找到的所有不能解释为选项的内容都被视为输出URL。
每个输入或输出URL原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。流的允许数量和/或类型可能会受到容器格式的限制。自动地或通过-map
选项选择要从哪个输入流进入哪个输出(请参阅“流选择”一章)。
要在选项中引用输入文件,必须使用其索引(从0开始)。例如,第一个输入文件是0
,第二个输入文件是,1
等等。类似地,文件中的流由它们的索引引用。例如,2:3
引用第三输入文件中的第四流。另请参阅“流说明符”一章。
通常,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每次出现都应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细级别),应首先指定。
不要混合输入文件和输出文件–首先指定所有输入文件,然后指定所有输出文件。也不要混用属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并且在文件之间重置。
- 要将输出文件的视频比特率设置为64 kbit / s,请执行以下操作:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
- 要将输出文件的帧速率强制为24 fps,请执行以下操作:
ffmpeg -i input.avi -r 24 output.avi
常用的命令行参数
- -c:指定编码器
- -c copy:直接复制,不经过重新编码(这样比较快)
- -c:v:指定视频编码器
- -c:a:指定音频编码器
- -i:指定输入文件
- -an:去除音频流
- -vn: 去除视频流
- -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
- -y:不经过确认,输出时直接覆盖同名文件。
常用的几种用法
- 查看视频文件信息
查看视频文件的元信息,比如编码格式和比特率,可以只使用-i
参数。
ffmpeg -i input.mp4
面命令会输出很多冗余信息,加上-hide_banner
参数,可以只显示元信息。
ffmpeg -i input.mp4 -hide_banner
- 转换编码格式
转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264
,所以只需指定输出文件的视频编码器即可。
ffmpeg -i [input.file] -c:v libx264 output.mp4
- 裁剪
裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。
ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
参考连接
FFmpeg libav tutorial
Digital video introduction