Oh, my FFmpeg!

常识介绍

容器

人们谈论的视频文件格式其实就是容器格式。
媒体文件是既包括视频又包括音频、甚至还带有脚本的一个集合,因此被称为容器。

常见的流媒体技术的相关容器:

.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

原文地址:https://www.cnblogs.com/develon/p/14251164.html