480p 720p 1080p 2k 4k 8k 12k分辨率视频分别占用多大带宽?

技术背景

好多开发者,在设置视频编码参数的时候,对不同分辨率的带宽设置,缺乏相关的经验,实际上,视频分辨率与所需带宽之间的关系受到多个因素的影响,包括视频编码方式、帧率、视频内容的动态程度等。下面,我们对不同分辨率大致所需带宽的分析:

影响视频带宽的因素

  1. 视频编码方式

    • 不同的编码方式对带宽的需求差异很大。例如,H.264 是一种广泛使用的编码标准,它能够在相对较低的带宽下提供较好的视频质量。H.265(HEVC)则在相同视频质量下通常比 H.264 所需带宽更低。
    • 较新的编码标准如 AV1,也在不断提高压缩效率,进一步降低带宽需求。
  2. 帧率

    • 帧率越高,每秒钟传输的图像帧数就越多,所需的带宽也会相应增加。常见的帧率有 24fps、30fps、60fps 等。
    • 例如,一个 1080p 的视频,在 30fps 下所需的带宽可能与在 60fps 下有较大差异。
  3. 视频内容动态程度

    • 视频中如果有大量快速运动的画面、复杂的场景或细节丰富的图像,需要更多的带宽来准确传输这些信息。
    • 相比静态场景为主的视频,动作片、体育赛事等动态内容的视频通常需要更高的带宽。

不同分辨率的大致带宽需求

  1. 480p

    • 通常情况下,480p 的视频在较低的码率下也能有较好的观看体验。对于标清的 480p 视频,采用 H.264 编码,在 1Mbps - 2Mbps 的带宽下可以获得较为流畅的播放效果。
    • 如果视频内容相对简单,动态程度较低,可能在 1Mbps 以下的带宽也能播放,但可能会出现一些画质损失。
  2. 720p

    • 720p 的高清视频需要更高的带宽来保证画质。一般来说,采用 H.264 编码的 720p 视频在 2Mbps - 4Mbps 的带宽下可以获得较好的观看体验。
    • 如果是高动态的视频内容或者要求更高的画质,可能需要接近 5Mbps 的带宽。
  3. 1080p

    • 全高清的 1080p 视频对带宽要求更高。通常情况下,采用H.264 编码的 1080p 视频在 4Mbps - 8Mbps 的带宽下可以有较好的播放效果。
    • 对于高质量的 1080p 视频,特别是 60fps 的高帧率视频,可能需要10Mbps 甚至更高的带宽。
  4. 2K

    • 2K 分辨率(通常为 2560×1440)的视频需要大量的带宽来传输高质量的图像。一般来说,采用 H.264 编码的 2K 视频在 8Mbps - 15Mbps 的带宽下可以获得较好的观看体验。
    • 如果是高动态、高帧率或者对画质要求极高的情况,可能需要 20Mbps 以上的带宽。
  5. 4K

    • 4K 分辨率(通常为 3840×2160)是目前非常高的画质标准,对带宽的需求极大。采用 H.264 编码的 4K 视频通常需要 20Mbps - 50Mbps 的带宽才能获得较好的观看体验。
    • 而采用更高效的编码标准如 H.265 或 AV1,可能在较低的带宽下也能实现较好的画质,但一般也需要 15Mbps - 30Mbps 的带宽。对于高帧率、高动态的 4K 视频,可能需要超过 50Mbps 的带宽。
  6. 8K 视频

    • 如果视频编码效率较低,要流畅播放8K视频可能需要 70-80Mbps 的带宽。
    • 对于较高质量、高帧率的 8K 视频,带宽需求可能会达到 200Mbps 甚至更高。
  7. 12K 视频

    • 目前 12K 视频尚未广泛普及应用,相关的实际应用数据较少。但理论上,12K 视频的带宽需求会远高于 8K 视频。如果按照简单的像素数量比例来估算,12K 视频的带宽需求可能是 8K 视频的 1.5 倍左右,实际的带宽需求还会受到视频编码方式、帧率、色彩深度等多种因素的影响。

Android平台视频编码

Android平台上,有多种视频编码方式可供选择,每种编码方式都有其特点和适用场景。如果是高端 Android 设备,具有较强的处理器和图形处理能力,可以考虑使用 H.265 或 VP9 等高压缩比的编码方式,以获得更好的视频质量和更低的带宽需求。对于中低端设备,可能需要权衡编码效率和设备性能。H.264 可能是更合适的选择,以确保视频的流畅播放和较低的资源占用。

以大牛直播SDK的RTMP推送端为例,一般是根据视频宽高、帧率、H.264、H.265编码类型等,给出评估的码率范围,然后设置:

Android平台RTMP直播推送SDK

  • 音频编码:AAC/SPEEX;
  • 视频编码:H.264、H.265;
  • 推流协议:RTMP;
  • [音视频]支持纯音频/纯视频/音视频推送;
  • [摄像头]支持采集过程中,前后摄像头实时切换;
  • 支持帧率、关键帧间隔(GOP)、码率(bit-rate)设置;
  • 支持RTMP推送 live|record模式设置;
  • 支持前置摄像头镜像设置;
  • 支持软编码、特定机型硬编码;
  • 支持横屏、竖屏推送;
  • 支持Android屏幕采集推送;
  • 支持自建标准RTMP服务器或CDN;
  • 支持断网自动重连、网络状态回调;
  • 支持实时动态水印;
  • 支持实时快照;
  • 支持降噪处理、自动增益控制;
  • 支持外部编码前音视频数据对接;
  • 支持外部编码后音视频数据对接;
  • 支持RTMP扩展H.265(需设备支持H.265特定机型硬编码)和Enhanced RTMP;
  • 支持实时音量调节;
  • 支持扩展录像模块;
  • 支持Unity接口;
  • 支持H.264扩展SEI发送模块;
  • 支持Android 5.1及以上版本。
java 复制代码
//估计硬编码码率, 可以根据实际机型调整
public static int estimate_video_hardware_kbps(int width, int height, int fps, boolean is_h264) {
	int kbps;
	int area = width * height;
	if (area <= (320 * 300))
		kbps = is_h264?350:280;
	else if (area <= (370 * 320))
		kbps = is_h264?470:400;
	 else if (area <= (640 * 360))
		kbps = is_h264?850:650;
   else if (area <= (640 * 480))
		kbps = is_h264?1200:800;
	else if (area <= (800 * 600))
		kbps = is_h264?1300:950;
	else if (area <= (900 * 700))
		kbps = is_h264?1600:1100;
	else if (area <= (1280 * 720))
		kbps = is_h264?2100:1500;
	 else if (area <= (1366 * 768))
		kbps = is_h264?2300:1900;
	 else if (area <= (1600 * 900))
		kbps = is_h264?2800:2300;
	else if (area <= (1600 * 1050))
		kbps =is_h264?3100:2500;
	 else if (area <= (1920 * 1088))
		kbps = is_h264?4200:2800;
	else
		kbps = is_h264?4500:3500;

	kbps = (int)(kbps*fps*1.0/25.0 + 0.5);
	return kbps;
}

Android APP层调用逻辑如下:

java 复制代码
if (videoEncodeType == 1) {
	int kbps = LibPublisherWrapper.estimate_video_hardware_kbps(width, height, fps, true);
	Log.i(TAG, "h264HWKbps: " + kbps);
	int isSupportH264HWEncoder = lib_publisher.SetSmartPublisherVideoHWEncoder(handle, kbps);
	if (isSupportH264HWEncoder == 0) {
		lib_publisher.SetNativeMediaNDK(handle, 0);
		lib_publisher.SetVideoHWEncoderBitrateMode(handle, 1); // 0:CQ, 1:VBR, 2:CBR
		lib_publisher.SetVideoHWEncoderQuality(handle, 39);
		lib_publisher.SetAVCHWEncoderProfile(handle, 0x08); // 0x01: Baseline, 0x02: Main, 0x08: High

		// lib_publisher.SetAVCHWEncoderLevel(handle, 0x200); // Level 3.1
		// lib_publisher.SetAVCHWEncoderLevel(handle, 0x400); // Level 3.2
		// lib_publisher.SetAVCHWEncoderLevel(handle, 0x800); // Level 4
		lib_publisher.SetAVCHWEncoderLevel(handle, 0x1000); // Level 4.1 多数情况下,这个够用了
		//lib_publisher.SetAVCHWEncoderLevel(handle, 0x2000); // Level 4.2

		// lib_publisher.SetVideoHWEncoderMaxBitrate(handle, ((long)h264HWKbps)*1300);

		Log.i(TAG, "Great, it supports h.264 hardware encoder!");
	}
} else if (videoEncodeType == 2) {
	int kbps = LibPublisherWrapper.estimate_video_hardware_kbps(width, height, fps, false);
	Log.i(TAG, "hevcHWKbps: " + kbps);
	int isSupportHevcHWEncoder = lib_publisher.SetSmartPublisherVideoHevcHWEncoder(handle, kbps);
	if (isSupportHevcHWEncoder == 0) {
		lib_publisher.SetNativeMediaNDK(handle, 0);
		lib_publisher.SetVideoHWEncoderBitrateMode(handle, 1); // 0:CQ, 1:VBR, 2:CBR
		lib_publisher.SetVideoHWEncoderQuality(handle, 39);

		// libPublisher.SetVideoHWEncoderMaxBitrate(handle, ((long)hevcHWKbps)*1200);

		Log.i(TAG, "Great, it supports hevc hardware encoder!");
	}
}

JNI层接口设计如下:

java 复制代码
 /*
 * SmartPublisherJniV2.java
 * WeChat:xinsheng120
 * Created by daniusdk.com on 2015/09/20.
 */
 
 /**
  * Set Video H.264 HW Encoder, if support HW encoder, it will return 0(设置H.264硬编码)
  * 
  * @param kbps: the kbps of different resolution.
  * 
  * @return {0} if successful
  */
public native int SetSmartPublisherVideoHWEncoder(long handle, int kbps);

/**
 * Set Video H.265(hevc) hardware encoder, if support H.265(hevc) hardware encoder, it will return 0(设置H.265硬编码)
 *
 * @param kbps: the kbps of different resolution.
 *
 * @return {0} if successful
 */
public native int SetSmartPublisherVideoHevcHWEncoder(long handle, int kbps);

/**
 * 设置视频硬编码是否使用 Native Media NDK, 默认是不使用, 安卓5.0以下设备不支持
 * @param handle
 * @param is_native: 0表示不使用, 1表示使用, sdk默认是0.
 * @return {0} if successful
 */
public native int SetNativeMediaNDK(long handle, int is_native);

/*
* 设置视频硬编码码率控制模式
* @param hw_bitrate_mode: -1表示使用默认值, 不设置也会使用默认值, 0:CQ, 1:VBR, 2:CBR, 3:CBR_FD, 请参考:android.media.MediaCodecInfo.EncoderCapabilities
* 注意硬编码和手机硬件有关,多数手机只支持部分码率模式, 另外硬编码设备差异很大,不同设备同一码率控制模式效果可能不一样
* @return {0} if successful
*/
public native int SetVideoHWEncoderBitrateMode(long handle, int hw_bitrate_mode);


/*
 * 设置视频硬编码复杂度, 安卓5.0及以上支持
 * @param hw_complexity: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getComplexityRange() 和 android.media.MediaFormat.KEY_COMPLEXITY
 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
 * @return {0} if successful
 */
public native int SetVideoHWEncoderComplexity(long handle, int hw_complexity);

/*
 * 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效
 * @param hw_quality: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getQualityRange() 和 android.media.MediaFormat.KEY_QUALITY
 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
 * @return {0} if successful
 */
public native int SetVideoHWEncoderQuality(long handle, int hw_quality);

/*
 * 设置H.264硬编码Profile, 安卓7及以上支持
 * @param hw_avc_profile: 0表示使用默认值, 0x01: Baseline, 0x02: Main, 0x08: High, 0x10000: ConstrainedBaseline, 0x80000: ConstrainedHigh;
 * 注意: ConstrainedBaseline 和 ConstrainedHigh 可能多数设备不支持,
 * H.264推荐使用 High 或者 ConstrainedHigh, 如果您使用的手机硬解码解不了,那还是设置Baseline
 * 如果设置的Profile硬编码器不支持,应编码器会使用默认值
 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
 * @return {0} if successful
 */
public native int SetAVCHWEncoderProfile(long handle, int hw_avc_profile);

/*
 * 设置H.264硬编码Level, 这个只有在设置了Profile的情况下才有效, 安卓7及以上支持
 * @param hw_avc_level: 0表示使用默认值, 0x100: Level3, 0x200: Level3.1, 0x400: Level3.2,
 * 0x800: Level4, 0x1000: Level4.1, 0x2000: Level4.2,
 * 0x4000: Level5, 0x8000: Level5.1,  0x10000: Level5.2,
 * 0x20000: Level6, 0x40000: Level6.1,  0x80000: Level6.2,
 * 如果设置的level太高硬编码器不支持,SDK内部会做相应调整
 * 注意: 640*480@25fps最小支持的是Level3, 720p最小支持的是Level3.1, 1080p最小支持的是Level4
 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
 * @return {0} if successful
 */
public native int SetAVCHWEncoderLevel(long handle, int hw_avc_level);

/*
 * 设置视频硬编码最大码率, 安卓没有相关文档说明, 所以不建议设置,
 * @param hw_max_bitrate: 每秒最大码率, 单位bps
 * @return {0} if successful
 */
public native int SetVideoHWEncoderMaxBitrate(long handle, long hw_max_bitrate);

需要注意的是,以上只是大致的带宽范围,实际所需带宽可能会因具体情况而有所不同。在网络环境较差的情况下,为了保证视频的流畅播放,视频播放平台可能会自动降低视频的分辨率和码率,从而减少带宽需求。

相关推荐
xcLeigh5 小时前
HTML5超酷响应式视频背景动画特效(六种风格,附源码)
前端·音视频·html5
韩曙亮7 小时前
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
ffmpeg·音视频·avpacket·av_packet_clone·av_packet_ref·ffmpeg内存结构
韦德斯10 小时前
嵌入式Linux的RTC读写操作应用
linux·运维·c语言·arm开发·实时音视频
CrystalShaw10 小时前
RTC QoS方法十三.(ReedSolomonFEC简介)
实时音视频
Vodka~10 小时前
物联网——UNIX时间戳、BKP备份寄存器、RTC时钟
物联网·实时音视频
9527华安10 小时前
FPGA实现PCIE3.0视频采集转10G万兆UDP网络输出,基于XDMA+GTH架构,提供工程源码和技术支持
网络·fpga开发·udp·音视频·xdma·pcie3.0·万兆网
电子科技圈11 小时前
XMOS携手合作伙伴晓龙国际联合推出集成了ASRC等功能的多通道音频板
科技·嵌入式硬件·mcu·物联网·音视频·iot
码码哈哈0.011 小时前
免费的视频混剪综合处理工具介绍与下载
音视频
莫固执,朋友11 小时前
网络抓包工具tcpdump 在海思平台上的编译使用
网络·ffmpeg·音视频·tcpdump
深海呐12 小时前
Android 从本地选择视频,用APP播放或进行其他处理
android·音视频·从本地选择视频,用app播放·从本地选择视频,并拿到信息·跳转到本地视频列表