最近在下载直播视频时,大器发现下载的视频是FLV格式,在快进或者拖动播放进度条时,视频图像会卡住不动很长时间,极大影响观看体验。解决FLV播放问题的方法是将FLV转换为大部分设备都支持的MP4格式。虽然本文是以FLV转MP4为例,但同样适用于其他类型视频文件的转换,包括WebM、AVI和WMV。
编码简介
FLV格式发布于2002年,一经推出便迅速成为了网页默认的视频格式,是第一个在互联网上被广泛使用的视频格式。
随着移动设备成为互联网的主力军,HTML5取代了大多数网页中的Flash,MP4取代了FLV容器,MP4成为视频的事实标准。由于FLV文件只能在基于Flash的视频播放器中播放,Flash被淘汰后,FLV文件要想在移动设备或者不带Flash的浏览器中播放的话,需要将FLV转为MP4格式。
要对视频进行格式转换有非常多的工具,比较常用的是格式工厂(FormatFactory),但绝大部分工具都基于FFmpeg或者使用了FFmpeg的编解码库。直接使用FFmpeg可以更灵活地实现我们的需求。
在使用FFmpeg工具前需要先下载并在电脑中配置好,具体操作方法可以查看大器之前的文章《FFmpeg安装配置指南》。
目前常见的MP4文件的视频和音频编码方式分别为H.264和AAC。H.264与MPEG-2和MPEG-4编码相比,在同等图像质量条件下压缩率更高,还能提供连续、流畅的高质量图像(相当于DVD质量)。AAC编码能够保证完美的音质,极高的压缩比。AAC与MP3相比,增加了对立体声的完美再现、降噪等特性,再现CD的音质。
FLV容器可以存储多种视频和音频编码,视频编码主要有Sorenson Spark、VP6、H.264,音频编码主要有Nellymoser Asao、Speex、MP3。可以通过以下命令查看FLV文件的视频和音频编码:
ffmpeg -i video.flv
然后可以在输出信息中找到以下信息:
Input #0, flv, from 'video.flv': Duration: 02:02:07.46, start: 3758.107000, bitrate: 1007 kb/s Stream #0:0: Audio: aac (HE-AAC), 44100 Hz, stereo, fltp Stream #0:1: Video: h264 (High), yuv420p(tv, smpte170m, progressive), 720x1280, 2000 kb/s, 15 fps, 15 tbr, 1k tbn
编码转换
实际上编码转换可以只用下面的第四种命令,但是对相同编码的流重新编码会损失数据,并且花费更长的时间。根据FLV源文件的编码格式,FLV转MP4可分为以下四种情况:
1. H.264视频编码和AAC音频编码
如果FLV文件的编码分别为H.264和AAC,直接将视频和音频流复制到MP4即可。此命令仅仅改变数据流的容器而无需重新编码,视频和音频质量相同,文件大小基本保持不变,并且处理速度最快。
ffmpeg -i video.flv -codec copy video.mp4
2. H.264视频编码和非AAC音频编码
直接复制视频流,音频流会自动按MP4的标准重新编码。此命令会对音频质量造成损失,文件大小可能有一些差异,处理速度一般。
ffmpeg -i video.flv -vcodec copy video.mp4
对于音频流可以使用-ar指定采样率(kHz),-ac指定声道数量(1:单声道,2:双声道)
ffmpeg -i video.flv -ar 44100 -ac 2 -vcodec copy video.mp4
3. 非H.264视频编码和AAC音频编码
直接复制音频流,视频流会自动按MP4的标准重新编码。此命令会对视频质量造成损失,文件大小可能有较大差异,处理速度较慢。实际上这种规格的文件是非常罕见的。
ffmpeg -i video.flv -acodec copy video.mp4
4. 非H.264视频编码和非AAC音频编码
如果FLV文件的视频编码不是H.264并且音频编码不是AAC,那么视频和音频需要按MP4的标准重新编码。此命令会对视频和音频质量造成损失,文件大小可能有很大差异,处理速度最慢。
ffmpeg -i video.flv video.mp4
了解FFmpeg的输出信息
FFmpeg在运行过程中会输出以下信息:
- FFmpeg的版本号和详细的构建命令
- 输入流的信息 (类型,码率,帧率,采样率,声道数)
- 输出流的信息
- 输入输出流的对应关系 (复制和转码的情况)
- 转换的统计数据 (时间,码率等)
我是大器,正在建立自己的知识库,并将这些经验分享给你,请关注我,一起交流学习。