流媒体那些参数

676 阅读9分钟

流媒体基本概念:分辨率、帧速率、码流、采样位深、采样率、比特率

一、分辨率

分辨率可以从显示分辨率与图像分辨率两个方向来分类。

显示分辨率

显示分辨率是显示器在显示图像时的分辨率,分辨率是用点来衡量的,显示器上这个“点”就是指像素(pixel)。显示分辨率的数值是指整个显示器所有可视面积上水平像素和垂直像素的数量。例如800×600的分辨率,是指在整个屏幕上水平显示800个像素,垂直显示600个像素。显然,分辨率越高,显示屏可显示的像素就越多,图像就越清晰。

图像分辨率

图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。常见的分辨率(ps:图片中的分辨率长宽反过来理解下,没找到好的图,如4k:4096x2160)如下:

Untitled (2).png

二、帧速率

帧速率也称为FPS(Frames PerSecond)的缩写——帧/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(FPS)越多,所显示的动作就会越流畅。

比如我们常见的听人说30帧,25帧,其实就是一秒刷新30或者25帧图片,一般帧率为25,人眼就已经很难察觉图像是不连续的或者影响观看效果了。

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2dpZi9OTmRuRzE3ZFdvTTNrbHp2VzhuTE1iTFBTTmM4U0hVUzBzZ2liUHR4bnJmWHNFVlEySWV6cW56Qk1pYjlPNDZpYzU2aWNLS1lFRGlhVzFweERLN2diZWxMSmhnLzY0MA.gif

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2dpZi9OTmRuRzE3ZFdvTTNrbHp2VzhuTE1iTFBTTmM4U0hVU2ljNU94WEp6ZG80ZzFRSm9reHhSaFB6UE1WaWJSWmJVREJRVE9EaWJlRkxWdWNvYUpQMjVZWThZZy82NDA.gif

三、码流

码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

如何根据图片分辨率算码流大小?

例如:我们以1920x1080分辨率计算,图片格式为YUV420,帧率为30 FPS,那么码流大小为:19201080(3/2)830/(1024*1024) = 89 Mb/s,至于为什么乘以3/2那就和YUV420格式存储有关系了,乘8即将Byte转为bit,如果图片格式为RGB24即一帧图片大小为分辨率x3,如果是RGB32即一帧图片大小为分辨率x4。

Untitled (3).png

四、采样位深

我们常见的16Bit(16比特),可以记录大概96分贝的动态范围。那么,您可以大概知道,每一个比特大约可以记录6分贝的声音。同理,20Bit可记录的动态范围大概就是120dB;24Bit就大概是144dB。假如,我们定义0dB为峰值,那么声音振幅以向下延伸计算,那么,CD音频可的动态范围就是“-96dB~0dB。”,依次类推,24Bit的HD-Audio高清音频的的动态范围就是“-144dB~0dB。”。由此可见,位深度较高时,有更大的动态范围可利用,可以记录更低电平的细节。

Untitled (4).png

五、采样率

采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样率是指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。

我们人耳能听到的声音一般在20Hz~20KHz之间,根据奈奎斯特采样定理,采样频率fs大于信号中最高频率fmax的2倍时,采样之后的数字信号便能完整的反应真实信号。所以44.1KHz为常见的采样率。

人的发音器官发出的声音频率大约是803400Hz,但人说话的信号平率通常为3003000Hz,人们把这种频率范围的信号称为话音(speech)信号。

采样率类似于动态影像的帧数,比如电影的采样率是24赫兹,PAL制式的采样率是25赫兹,NTSC制式的采样率是30赫兹。当我们把采样到的一个个静止画面再以采样率同样的速度回放时,看到的就是连续的画面。同样的道理,把以44.1kHZ采样率记录的CD以同样的速率播放时,就能听到连续的声音。显然,这个采样率越高,听到的声音和看到的图像就越连贯。当然,人的听觉和视觉器官能分辨的采样率是有限的,基本上高于44.1kHZ采样的声音,绝大部分人已经觉察不到其中的分别了。

而声音的位数就相当于画面的颜色数,表示每个取样的数据量,当然数据量越大,回放的声音越准确,不至于把开水壶的叫声和火车的鸣笛混淆。同样的道理,对于画面来说就是更清晰和准确,不至于把血和西红柿酱混淆。不过受人的器官的机能限制,16位的声音和24位的画面基本已经是普通人类的极限了,更高位数就只能靠仪器才能分辨出来了。比如电话就是3kHZ取样的7位声音,而CD是44.1kHZ取样的16位声音,所以CD就比电话更清楚。

常见的采样率为

8,000 Hz - 电话所用采样率, 对于人的说话已经足够

11,025 Hz

22,050 Hz - 无线电广播所用采样率

32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率

44,100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率

47,250 Hz - Nippon Columbia (Denon)开发的世界上第一个商用 PCM 录音机所用采样率

48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率

50,000 Hz - 二十世纪七十年代后期出现的 3M 和 Soundstream 开发的第一款商用数字录音机所用采样率

50,400 Hz - 三菱 X-80 数字录音机所用所用采样率

96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音轨、Blu-ray Disc(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率

2.8224 MHz - SACD、 索尼 和 飞利浦 联合开发的称为 Direct Stream Digital 的 1 位 sigma-delta modulation 过程所用采样率。

六、比特率

比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大,音质越好.比特率 =采样率 x 采用位数 x声道数.

关于比特率(比特率在音频或者视频领域也称为码率)的计算,比如,采样率为44.1KHz,以16bit采样,声道数为2,那么它的音频比特率的计算为:44100162 = 1411200 bps = 1378 kbps,然后我们在除以8,将bit转化为Byte,所以1秒钟的数据量就是:1411200/8 = 176400 个字节(B)。

以下是一些常用的比特率

  • 32kbit/s: 一般只适用于语音
  • 96kbit/s: 一般用于语音或低质量流媒体
  • 128或160kbit/s: 中等比特率质量
  • 192kbit/s: 中等质量比特率
  • 256kbit/s: 常用的高质量比特率
  • 320kbit/s: MP3标准支持的最高水平

那么我们如何分析一个音视频文件

先了解下 ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括WindowsMac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1]  FFmpeg编码库可以使用GPU加速。

FFmpeg

Untitled (5).png

  • ffmpeg 记录、转换多媒体流。
  • ffplay 多媒体流播放、甚至你可以基于它写一个自己的音视频播放器。
  • ffprobe 多媒体流分析器。

第一步:install

$ brew install ffmpeg 

ffplay ffprobe 这俩是自带的工具集、只需要安装核心的 ffmpeg

第二步:使用 ffprobe 分析获取多媒体流数据

$ ffprobe -show_streams -show_format json 'url | local meida'

# url 可以是https://xxx.flv | xxx.mp4

$ Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2021test.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.76.100
  Duration: 00:33:59.77, start: 0.000000, bitrate: 658 kb/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 519 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
    "streams": [        {            "index": 0,            "codec_name": "h264",            "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",            "profile": "High",            "codec_type": "video",            "codec_tag_string": "avc1",            "codec_tag": "0x31637661",            "width": 1280,            "height": 720,            "coded_width": 1280,            "coded_height": 720,            "closed_captions": 0,            "has_b_frames": 2,            "sample_aspect_ratio": "1:1",            "display_aspect_ratio": "16:9",            "pix_fmt": "yuv420p",            "level": 31,            "color_range": "tv",            "color_space": "bt709",            "color_transfer": "bt709",            "color_primaries": "bt709",            "chroma_location": "left",            "refs": 1,            "is_avc": "true",            "nal_length_size": "4",            "r_frame_rate": "30/1",            "avg_frame_rate": "30/1",            "time_base": "1/15360",            "start_pts": 0,            "start_time": "0.000000",            "duration_ts": 31330816,            "duration": "2039.766667",            "bit_rate": "519429",            "bits_per_raw_sample": "8",            "nb_frames": "61193",            "disposition": {                "default": 1,                "dub": 0,                "original": 0,                "comment": 0,                "lyrics": 0,                "karaoke": 0,                "forced": 0,                "hearing_impaired": 0,                "visual_impaired": 0,                "clean_effects": 0,                "attached_pic": 0,                "timed_thumbnails": 0            },            "tags": {                "language": "und",                "handler_name": "VideoHandler",                "vendor_id": "[0][0][0][0]"            }        },        {            "index": 1,            "codec_name": "aac",            "codec_long_name": "AAC (Advanced Audio Coding)",            "profile": "LC",            "codec_type": "audio",            "codec_tag_string": "mp4a",            "codec_tag": "0x6134706d",            "sample_fmt": "fltp",            "sample_rate": "48000",            "channels": 2,            "channel_layout": "stereo",            "bits_per_sample": 0,            "r_frame_rate": "0/0",            "avg_frame_rate": "0/0",            "time_base": "1/48000",            "start_pts": 0,            "start_time": "0.000000",            "duration_ts": 97906656,            "duration": "2039.722000",            "bit_rate": "128576",            "nb_frames": "95613",            "disposition": {                "default": 1,                "dub": 0,                "original": 0,                "comment": 0,                "lyrics": 0,                "karaoke": 0,                "forced": 0,                "hearing_impaired": 0,                "visual_impaired": 0,                "clean_effects": 0,                "attached_pic": 0,                "timed_thumbnails": 0            },            "tags": {                "language": "und",                "handler_name": "SoundHandler",                "vendor_id": "[0][0][0][0]"            }        }    ]
}

核心参数一览

Untitled

分离音视频

$ ffmpeg -i 'local meida source' -an -vcodec copy 'output.mp4' # 抽离视频
$ ffmpeg -i 'local meida source' -vn -acodec copy 'output.mp3' # 抽离音频

音频: aac mp3 wav 、视频:mp4 mov mkv flv vob rmvb

视频压缩

改变帧率

$ ffmpeg -i 'local.mp4'  -r 20  'output.mp4'

r 20:表示帧率设置为 20fps

压缩比: 40%

老师OBS 推出的流都是 -r 25

指定文件大小

$ ffmpeg -i 'local.mp4' -fs 15MB 'out.mp4'

fs 20 : 表示文件大小最大值为15MB

改变分辨率

$ ffmpeg -i 'local.mp4' -s vga 'out.mp4'

s vga : 指定分辨率, vga 代表 600*480,也可以换成其他的值

改变码率

视频的原码率是 2.1Mb/s ,压缩为 1.5Mb/s 0.4MB/s

ffmpeg -i 'local.mp4' -b:v 1.5M 'output.mp4'
  • b:v 1.5M : 指定码率
  • b:v :指定视频的码率
  • b:a : 指定音频的码率
  • 1.5M:码率的值 1.5M 表示 1.5Mb/s

当码率设置为小于 1.5Mb/s 后视频的清晰度会降低很多

终极压缩奥义~有损压缩

  • crf 取值范围0~51

全称:Constant Rate Factor,其中0为无损模式,数值越大,画质越差,生成的文件越小。18~28是一个合理的范围。18被认为是视觉无损的,它的输出视频质量和输入视频相当。

$ ffmpeg -i 'local.mp4' -csr 30 'out.mp4'

压缩比50%左右。

拓展问题

  1. 慢放速视频是如何产生的?

降格

  1. 有损视频和无损视频的差别?

画面的差别

前端如何应用 ffmpeg ???

ffmpeg.wasm