网站如何做广告,天猫网站建设的目标是什么意思,免费代理加盟项目,军事最新新闻头条技术背景
好多开发者#xff0c;在设置视频编码参数的时候#xff0c;对不同分辨率的带宽设置#xff0c;缺乏相关的经验#xff0c;实际上#xff0c;视频分辨率与所需带宽之间的关系受到多个因素的影响#xff0c;包括视频编码方式、帧率、视频内容的动态程度等。下面…技术背景
好多开发者在设置视频编码参数的时候对不同分辨率的带宽设置缺乏相关的经验实际上视频分辨率与所需带宽之间的关系受到多个因素的影响包括视频编码方式、帧率、视频内容的动态程度等。下面我们对不同分辨率大致所需带宽的分析
影响视频带宽的因素 视频编码方式 不同的编码方式对带宽的需求差异很大。例如H.264 是一种广泛使用的编码标准它能够在相对较低的带宽下提供较好的视频质量。H.265HEVC则在相同视频质量下通常比 H.264 所需带宽更低。较新的编码标准如 AV1也在不断提高压缩效率进一步降低带宽需求。 帧率 帧率越高每秒钟传输的图像帧数就越多所需的带宽也会相应增加。常见的帧率有 24fps、30fps、60fps 等。例如一个 1080p 的视频在 30fps 下所需的带宽可能与在 60fps 下有较大差异。 视频内容动态程度 视频中如果有大量快速运动的画面、复杂的场景或细节丰富的图像需要更多的带宽来准确传输这些信息。相比静态场景为主的视频动作片、体育赛事等动态内容的视频通常需要更高的带宽。
不同分辨率的大致带宽需求 480p 通常情况下480p 的视频在较低的码率下也能有较好的观看体验。对于标清的 480p 视频采用 H.264 编码在 1Mbps - 2Mbps 的带宽下可以获得较为流畅的播放效果。如果视频内容相对简单动态程度较低可能在 1Mbps 以下的带宽也能播放但可能会出现一些画质损失。 720p 720p 的高清视频需要更高的带宽来保证画质。一般来说采用 H.264 编码的 720p 视频在 2Mbps - 4Mbps 的带宽下可以获得较好的观看体验。如果是高动态的视频内容或者要求更高的画质可能需要接近 5Mbps 的带宽。 1080p 全高清的 1080p 视频对带宽要求更高。通常情况下采用H.264 编码的 1080p 视频在 4Mbps - 8Mbps 的带宽下可以有较好的播放效果。对于高质量的 1080p 视频特别是 60fps 的高帧率视频可能需要10Mbps 甚至更高的带宽。 2K 2K 分辨率通常为 2560×1440的视频需要大量的带宽来传输高质量的图像。一般来说采用 H.264 编码的 2K 视频在 8Mbps - 15Mbps 的带宽下可以获得较好的观看体验。如果是高动态、高帧率或者对画质要求极高的情况可能需要 20Mbps 以上的带宽。 4K 4K 分辨率通常为 3840×2160是目前非常高的画质标准对带宽的需求极大。采用 H.264 编码的 4K 视频通常需要 20Mbps - 50Mbps 的带宽才能获得较好的观看体验。而采用更高效的编码标准如 H.265 或 AV1可能在较低的带宽下也能实现较好的画质但一般也需要 15Mbps - 30Mbps 的带宽。对于高帧率、高动态的 4K 视频可能需要超过 50Mbps 的带宽。8K 视频 如果视频编码效率较低要流畅播放8K视频可能需要 70-80Mbps 的带宽。对于较高质量、高帧率的 8K 视频带宽需求可能会达到 200Mbps 甚至更高。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及以上版本。
//估计硬编码码率, 可以根据实际机型调整
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;elsekbps is_h264?4500:3500;kbps (int)(kbps*fps*1.0/25.0 0.5);return kbps;
}Android APP层调用逻辑如下
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:CBRlib_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 4lib_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:CBRlib_publisher.SetVideoHWEncoderQuality(handle, 39);// libPublisher.SetVideoHWEncoderMaxBitrate(handle, ((long)hevcHWKbps)*1200);Log.i(TAG, Great, it supports hevc hardware encoder!);}
}
JNI层接口设计如下 /** SmartPublisherJniV2.java* WeChatxinsheng120* 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*48025fps最小支持的是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);
需要注意的是以上只是大致的带宽范围实际所需带宽可能会因具体情况而有所不同。在网络环境较差的情况下为了保证视频的流畅播放视频播放平台可能会自动降低视频的分辨率和码率从而减少带宽需求。