8k分辨率需要多大带宽_一帧1920*1080的画面有多少比特,需要多大带宽观看是才不会卡顿?...

博客介绍了一帧1920*1080画面的比特数计算,以及高清电视节目拍摄帧频和电视刷新率的差异处理方式。还阐述了带宽与网速的关系,计算出稳定播放1920*1080高清电视节目理论和实际所需带宽,最后表示同理可计算2k、4k、8k等分辨率影片所需带宽。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一帧1920*1080的画面比特数 = 1920*1080 bits = 1920*1080/8 byte = 259 200 B = 1920*1080/8/1024 KB = 253.125 KB

高清电视节目都是以24帧/秒的标准拍摄的,电视的刷新率却是60HZ,就是说电视画面一秒种刷新60次。

而要在一台每秒刷新60次的显示设备上播放每秒24帧的图像,你必须填补,或者说再创造画面来满足每秒60次的刷新。

具体做法是把电影画面的第一帧变成成两个画面,第二帧变成3个画面,第三帧变成两个画面,第四帧变成3个。这种分成2~3帧的专业术语叫场频。

意思好像是说原始信号首先要经过播放机进行隔行化(24帧的画面变成60场),接着信号到了电视,电视再把他们去隔行化以1080p的画质显示出来。

带宽与网速的关系

所谓 1M 宽带,其实是指 1Mbps (兆比特每秒),亦即 1 x 1024 / 8 = 128KB/sec,但这只是理论上的速度,实际上则要再扣约 12% 的信息头标识等各种控制讯号,故其传输速度上限应为 112KB/sec 左右。

按理论上速度,要稳定播放1920*1080高清电视节目,需要的带宽:

带宽 = 253.125  * 24  / 128  = 47.4609375 M

按12%控制讯号损耗计算:

带宽 = 253.125  * 24  / 112 = 54.241071428571 M

所以实际上,在宽带速度稳定的前提下,一般需要60M宽带才能观看1920*1080(24帧/秒标准拍摄)的电视节目。

同理可得2k 4k 8k等分辨率的画质影片。

Build started: Project: STC8H8K64U Build target 'Target 1' linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: BMP MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: HZK MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_1608 MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_0806 MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: BMP MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: HZK MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_1608 MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_0806 MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: _OLED_POW MODULE: .\Objects\OLED_.obj (OLED_) *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWSTRING?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWSIGNEDNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWHEXNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWBINNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_DISPLAY_ON?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_DISPLAY_OFF?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_COLORTURN?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_DISPLAYTURN?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWNUM?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWSTRING?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWCHINESE?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_DRAWBMP?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_INIT?OLED_ Program Size: data=89.0 xdata=23688 code=25895 Target not created. Build Time Elapsed: 00:00:01
03-27
<think>嗯,用户遇到了Keil编译STC8H8K64U项目时的L104错误,个模块重复定义了BMP、HZK等符号。首先,我需要回忆一下L104错误的常见原因。这个错误通常是因为同一个变量或函数在个地方被定义,导致链接器无法确定使用哪个定义。用户提到的错误出现在I2C.obj和OLED_.obj中,说明这两个模块都包含了这些符号的定义。 接下来,考虑可能的情况。用户可能在头文件中定义了变量,而没有使用extern关键字声明,然后在个源文件中包含该头文件,导致每个源文件都有一份定义,从而引发重复定义。例如,如果BMP数组在某个头文件中直接定义,并且被I2C.c和OLED_.c包含,就会导致这个问题。 另外,还要注意是否在源文件中重复定义了这些变量或函数。比如,可能不小心在I2C.c和OLED_.c中都写了BMP的初始化代码,而没有使用条件编译或者静态声明。 关于警告L16,未调用的函数段,可能是因为代码中有一些函数未被使用,或者函数名拼写错误导致调用不到。需要用户检查这些函数是否真的需要,或者是否有拼写错误。 解决方案方面,首先应该检查这些符号的定义位置。如果是在头文件中,应该改为使用extern声明,并在一个单独的源文件中定义。如果在个源文件中定义,需要使用extern或者在其中一个文件中定义为静态。此外,未调用的函数可以考虑删除,或者确认是否有调用但被条件编译屏蔽了。 同时,用户的项目可能涉及个模块共用字体或图像数据,需要确保这些数据只在一个地方定义,其他地方通过extern引用。另外,检查头文件的包含防护是否做好,避免重复包含导致次定义。 最后,建议用户检查相关头文件和源文件,使用extern关键字声明变量,在合适的源文件中定义,并确保函数要么被调用,要么被移除。这样应该能解决L104错误,减少警告数量。</think>你遇到的编译错误主要是由符号重复定义和未调用函数引起的,以下是分步解决方案: $\boxed{错误L104分析}$ 1. $\textcolor{blue}{根本原因}$:BMP/HZK/ASC2_1608等符号在个模块(I2C.obj和OLED_.obj)中被重复定义 2. $\textcolor{red}{常见场景}$: - 头文件中直接定义变量(未用extern声明) - .c文件包含相同变量定义 - 函数实现写在头文件中 $\boxed{解决方案}$ 1. $\textcolor{green}{变量重复定义处理}$: ```c // 错误示例(在.h文件中): unsigned char BMP[] = {0x00,0x01...}; // 直接定义 // 正确做法: // 在.h文件中声明 extern unsigned char BMP[]; // 在单独的.c文件中定义 unsigned char BMP[] = {0x00,0x01...}; ``` 2. $\textcolor{green}{函数重复定义处理}$: ```c // 错误示例(模块包含相同函数): void OLED_POW() {...} // 在I2C.c和OLED_.c中都有定义 // 正确做法: // 在.h文件中声明 void OLED_POW(void); // 仅在OLED_.c中实现 ``` $\boxed{警告L16分析}$ 1. 编译器检测到OLED_SHOWSTRING、OLED_SHOWNUM等函数未被调用 2. 可能原因: - 确实未使用的冗余代码 - 函数命名错误导致调用失败 - 条件编译未启用相关功能 $\boxed{优化建议}$ 1. 使用$\textcolor{purple}{static}$限定符限制作用域: ```c static void InternalFunction(void) {...} // 仅在本文件可见 ``` 2. 合并字体数据定义到独立模块(如font.c/font.h) 3. 使用条件编译管理不同版本: ```c #ifdef USE_OLED void OLED_ShowString(...) {...} #endif ``` $\boxed{项目结构调整建议}$ ``` Project/ ├── Inc/ │ ├── font.h // 字体extern声明 │ └── oled.h // 函数原型 └── Src/ ├── font.c // 字体数据定义 ├── i2c.c // 仅I2C相关实现 └── oled.c // OLED驱动实现 ``` 最后检查: 1. 所有全局变量在.h中用extern声明 2. 所有函数原型在.h中声明 3. 实际定义仅存在于一个.c文件中 4. 删除未使用的函数减少代码体积 完成上述修改后,重新编译应可消除L104错误,警告L16可根据实际情况选择保留或删除未使用函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值