Android在线视频,RTMP,MediaCodec,MediaCamera(码流_分辨率_帧率)

视频带宽计算公式(码流_分辨率_帧率)   (自己整理过的.)

MediaRecorder有很强的硬件依赖性,因此不同的手机表现是不一样的,有的手机数据传输的时候会出现阻塞现象,实时性就降低了


码流/码率

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

视频每秒钟的大小,例如800Kbps,就是一秒钟的视频大小100KB(1字节=8比特,所以要除以8),视频如果有1000秒,整个视频大小就是100KB*1000约等于100MB。当然有些视频的码率不是恒定的,会根据画面情况采用不同的码率,这样可以尽可能地缩小视频体积且保证质量。一般来讲视频码率越大质量越好(当然还得看视频压制技术,专业软件和入门软件压制出来的视频即使码率一样效果还是有很大差异)

720P 大约就是百万像素 ,码流大约在2到4或者5M, 1080P 大约在4到8M , 这个要看他们厂家的码流控制的怎么样

帧率

     一帧就是一副静止的画面,连续的帧就形成动画,如电视图象等。我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。


分辨率

视频分辨率是指视频成像产品所成图像的大小或尺寸。常见的视像分辨率有352×288,176×144,640×480,1024×768。在成像的两组数字中,前者为图片长度,后者为图片的宽度,两者相乘得出的是图片的像素,长宽比一般为4:3.  目前监控行业中主要使用Qcif(176×144)、CIF(352×288)、HALF D1(704×288)、D1(704×576)等几种分辨率。

D1是数字电视系统显示格式的标准,共分为以下5种规格:

D1:480i格式(525i):720×480(水平480线,隔行扫描),和NTSC模拟电视清晰度相同,行频为15.25kHz,相当于我们所说的4CIF(720×576)

 

D2:480P格式(525p):720×480(水平480线,逐行扫描),较D1隔行扫描要清晰不少,和逐行扫描DVD规格相同,行频为31.5kHz

 

D3:1080i格式(1125i):1920×1080(水平1080线,隔行扫描),高清方式采用最多的一种分辨率,分辨率为1920×1080i/60Hz,行频为33.75kHz

 

D4:720p格式(750p):1280×720(水平720线,逐行扫描),虽然分辨率较D3要低,但是因为逐行扫描,市面上更多人感觉相对于1080I(实际逐次540线)视觉效果更加清晰。不过个人感觉来说,在最大分辨率达到1920×1080的情况下,D3要比D4感觉更加清晰,尤其是文字表现力上,分辨率为1280×720p/60Hz,行频为45kHz

 

  D5:1080p格式(1125p):1920×1080(水平1080线,逐行扫描),目前民用高清视频的最高标准,分辨率为1920×1080P/60Hz,行频为67.5KHZ。

其中D1 和D2标准是我们一般模拟电视的最高标准,并不能称的上高清晰,D3的1080i标准是高清晰电视的基本标准,它可以兼容720p格式,而D5的1080P只是专业上的标准。

 

 

帧率、码流与分辨率之间关系

公式:

带宽 / (码流 * 8) = 同时在线人数

文件大小 = 时间×码率/8

 

一个视频文件的大小为5.86M,播放时长为3分7秒:

1,该文件对应的码流就是

5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) =262872.95657754bps

2,10M独享带宽能支撑的同时在线人数

10* 1024 * 1024 / 262872.95657754 =39.889078498294

3,支撑1000人同时在线的系统最少需要的带宽数为

262872* 1000 / (1024 * 1024) = 250.69427490234M

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的例程,它演示了如何在Qt下使用OpenCV进行RTMP推流: ```c++ #include <QCoreApplication> #include <opencv2/opencv.hpp> #include <rtmp.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化RTMPRTMP_LibInit(); // 创建RTMP对象 RTMP *rtmp = RTMP_Alloc(); // 设置RTMP属性 RTMP_SetupURL(rtmp, "rtmp://your_rtmp_server_address"); RTMP_EnableWrite(rtmp); RTMP_Connect(rtmp, NULL); RTMP_ConnectStream(rtmp, 0); // 打开视频文件 cv::VideoCapture cap(0); // 检查视频文件是否打开成功 if (!cap.isOpened()) { qDebug() << "Failed to open video file."; return -1; } // 定义视频帧 cv::Mat frame; // 读取视频帧并推送到RTMP服务器 while (true) { // 读取视频帧 cap >> frame; // 检查视频帧是否为空 if (frame.empty()) { qDebug() << "End of video file."; break; } // 将视频帧转换为RTMP数据包 RTMPPacket *packet = RTMPPacket_Alloc(1024 * 64); // 填充RTMP数据包 RTMPPacket_Reset(packet); packet->m_nChannel = 0x04; packet->m_headerType = RTMP_PACKET_SIZE_LARGE; packet->m_packetType = RTMP_PACKET_TYPE_VIDEO; packet->m_nTimeStamp = RTMP_GetTime() - 500; packet->m_nInfoField2 = rtmp->m_stream_id; packet->m_nBodySize = cv::imencode(".jpg", frame).size(); memcpy(packet->m_body, cv::imencode(".jpg", frame).data(), packet->m_nBodySize); // 发送RTMP数据包 RTMP_SendPacket(rtmp, packet, true); RTMPPacket_Free(packet); // 等待一段时间 cv::waitKey(30); } // 断开RTMP连接 RTMP_Close(rtmp); RTMP_Free(rtmp); // 清理RTMPRTMP_LibExit(); return a.exec(); } ``` 这个例程使用OpenCV的VideoCapture类来读取摄像头视频帧,并将每一帧转换为RTMP数据包,并使用RTMP_SendPacket函数将数据包发送到RTMP服务器。请注意,此示例中的推流代码仅适用于视频帧大小不超过64KB的情况,如果您的视频帧大小超过64KB,则需要修改代码以支持较大的数据包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值