常识介绍
容器
人们谈论的视频文件格式其实就是容器格式。
媒体文件是既包括视频又包括音频、甚至还带有脚本的一个集合,因此被称为容器。
常见的流媒体技术的相关容器:
.ts HLS技术下的视频切片容器
.flv HTTP+flv技术
音频视频编码
音频视频编码方案有很多,用百家争鸣形容不算过分,目前常见的音频视频编码有以下几类:
MPEG
H.26X 系列:(由 ITU 国际电传视讯联盟 主导,侧重网络传输,注意:只是视频编码)
目前主要的视频压缩协议有:
h.261 、 h.263 、 h.264 和 mpeg 1 、 mpeg 2 和 mpeg 4 。
音频协议也分两大类,itu 组织的主要是用于视频会议的 g 系列协议,以及更为人熟知一些的 iso 的音频:
mp3 ,它的全称是 mpeg 1 audio layer 3 ,意思是 mpeg 1 的音频第三层;
aac ,最新的音频算法(也称为 mp4 ),它定义在 mpeg 2 或 mpeg 4 的音频部分。
特点:音质好,支持多声道,高采样精度和采样频率,尤其对音乐的压缩效果比 g 系列要好太多。
h.264
h.264是 iso 和 itu 两大组织共同制定的最新的算法成果,它在算法层面应该说是非常先进了,有人评价, h.264 是视频压缩技术的一个里程碑,在可预见的 5 到 10 年内,出现新的视频压缩协议可能性很小,除非压缩理论有重大突破。
OBS视频推流协议就是h.264,当然,有软件(x264)和硬件的区分。
h264_nvenc使用NVidia硬件辅助的H.264视频编码器。libx264是基于软件(CPU)的H.264编码器。
猜想在相同的比特率下,libx264的质量比h264_nvenc好。
h264_nvenc可能更快并且使用更少的功率。h264_nvenc仅在NVIDIA硬件上可用。
基本参数介绍
-hide_banner
禁止输出构建配置configuration等信息。
-re
-re标志表示以本地帧速率读取输入。主要用于模拟抓取设备。
例如,如果您要流式传输视频文件,则要使用它,否则它可能会流式传输太快(默认情况下,它尝试以线速流式传输)。我的猜测是,从实时设备流式传输时,您通常不希望使用此标志。
-i
指定audio/video输入。可以是本地文件路径,也可以是URL。
ffmpeg -i file.mp4
-f
指定封装容器格式。如果输出是带后缀的文件名,那么可以忽略该参数。
ffmpeg -i file.mp4 -f flv
-c copy
保留原始编码方式。
ffmpeg -i file.mp4 -f flv -c copy
-stream_loop -1
设置循环播放次数,-1
表示无限循环。该参数必须于-i
参数之前提供。
ffmpeg -stream_loop -1 -i file.mp4 -f flv -c copy
输出
ffmpeg -stream_loop -1 -i file.mp4 -f flv -c copy rtmp://localhost/live/<NAME>
重新编码,-c:(v/a)
-vcodec,简写为-c:v
ffmpeg -i input.mp4 -c:v h264 -f flv out.flv
ffmpeg -i input.mp4 -c:v h264_nvenc -f flv out.flv #使用N卡硬解,实测文件体积较大,探测结果为Stream #0:0: Video: h264 (Main)
-acodec,简写为-c:a
ffmpeg -i file.avi -vn -c:a aac out.mp4 #仅提取音频,并重新编码为mp4
限制码率,-b:(v/a)
指定码率
ffmpeg -i input.mkv -c:a copy -c:v copy -b:v 600k out.mkv #错误,-c:v copy导致-b:v被忽略,文件未经处理
ffmpeg -i input.mkv -c:a copy -b:v 600k out.mkv
压缩前:
Duration: 00:05:08.82, start: -0.007000, bitrate: 1130 kb/s
压缩后:
Duration: 00:05:08.82, start: -0.007000, bitrate: 766 kb/s
动态码率,-qscale 2
ffmpeg -i input.mkv -c:a copy -qscale 2 out.mkv
Duration: 00:05:08.82, start: -0.007000, bitrate: 956 kb/s
Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number set the number of bits per raw sample
-vn disable video
-vcodec codec force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff set initial TimeCode value.
-pass n select the pass number (1 to 3)
-vf filter_graph set video filters
-ab bitrate audio bitrate (please use -b:a)
-b bitrate video bitrate (please use -b:v)
-dn disable data
Audio options:
-aframes number set the number of audio frames to output
-aq quality set audio quality (codec-specific)
-ar rate set audio sampling rate (in Hz)
-ac channels set number of audio channels
-an disable audio
-acodec codec force audio codec ('copy' to copy stream)
-vol volume change audio volume (256=normal)
-af filter_graph set audio filters
RTMP推流
须知
RTMP 协议只可以使用 AMF 与 FLV 流容器。
ffmpeg -stream_loop -1 -i out.mkv -f flv -c:v copy -b:v 600 rtmp://localhost:1935/live/STREAM_NAME
对flv流重新编码后再推流:
ffmpeg -i http://localhost:8000/live/a.flv -c:a aac -c:v h264 -f flv rtmp://localhost/live/b
FLV关键帧索引
-flvflags add_keyframe_index