视频解码故障案例两则

news/2024/7/20 13:54:10 标签: 音视频

 案例1 绿边


故障分析:

这个能明显看到视频上方出现绿色半透明边带。这说明Y数据正常。UV数据不正常。

它显然与视频帧的垂直分辨率设置有关。

UV数据和Y数据是连续放置的,如果上方出现彩色数据失调,说明这部分数据实际仍然是Y数据。也就是说如果这是1920*1080p的数据,那么说明它的线数比1080更大。

根据绿边行数/2,加至1080的数据上,故障消失:

案例2 栅格

故障分析

上面的配置下,出现水平数据的错位,在上面可以正常的显示被拆分成了3个带状的数据。YUV模式下不好看故障的特征,先把UV数据消掉,用标准的灰度图像去观察:

相关的灰度UV数据生成:

uv_plane = np.full((height // 2, width), 128, dtype=np.uint8)

最终根据灰度图上的关键点位的相对位置,得到了真正的width,修正后:

 

附录 A 16*16宏块分散的视频数据重组为标准YUV-420

这段代码没有用到,备用。本来是为了处理案例2.

    def merge_to_yuv420(self, macrobloc_data, width, height):
        # Calculate sizes
        Y_size = width * height
        U_size = Y_size // 4  # U and V are quarter size of Y
        
        # Initialize arrays for Y, U, V
        Y = np.empty((height, width), dtype=np.uint8)
        U = np.empty((height // 2, width // 2), dtype=np.uint8)
        V = np.empty((height // 2, width // 2), dtype=np.uint8)
        
        # Merge macroblocks into Y, U, V components
        for r in range(height // 16):
            for c in range(width // 16):
                macroblock_index = r * (width // 16) + c
                Y_block_start = macroblock_index * 256
                U_block_start = Y_size + (macroblock_index * 64)
                V_block_start = Y_size + U_size + (macroblock_index * 64)
                
                # Merge Y block
                Y[r*16:(r+1)*16, c*16:(c+1)*16] = np.frombuffer(macrobloc_data[Y_block_start:Y_block_start+256], dtype=np.uint8).reshape(16, 16)
                
                # Merge U and V blocks
                U[r*8:(r+1)*8, c*8:(c+1)*8] = np.frombuffer(macrobloc_data[U_block_start:U_block_start+64], dtype=np.uint8).reshape(8, 8)
                V[r*8:(r+1)*8, c*8:(c+1)*8] = np.frombuffer(macrobloc_data[V_block_start:V_block_start+64], dtype=np.uint8).reshape(8, 8)
        
        return Y, U, V


    def nv12_to_rgb(self, nv12, width, height):
        width = 1920
        height = 1080
        Y,U,V = self.merge_to_yuv420(nv12, width, height)
        U_upsampled = cv2.resize(U, (width, height), interpolation=cv2.INTER_LINEAR)
        V_upsampled = cv2.resize(V, (width, height), interpolation=cv2.INTER_LINEAR)
        yuv_image = np.concatenate((Y, U_upsampled, V_upsampled))
    
        # Use OpenCV to convert YUV420sp (NV12) to RGB
        rgb_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2RGB_IYUV)
        return rgb_image


http://www.niftyadmin.cn/n/5548424.html

相关文章

react 的条件渲染

##### 使用 if/else 语句 可以在 JSX 中使用普通的 JavaScript if/else 语句来进行条件渲染。 import React from react; function ConditionalRender(props) {const isLoggedIn props.isLoggedIn;if (isLoggedIn) {return <UserGreeting />;} else {return <Guest…

深入理解JS中的闭包

闭包是JavaScript中一个非常强大的特性,它允许函数访问并操作函数外部的变量。在深入理解闭包之前,我们需要先了解JavaScript的作用域和作用域链的概念。 1、作用域和作用域链 在JavaScript中,作用域决定了代码块中变量和其他资源的可见性。JavaScript有两种类型的作用域:…

人工智能与技术失业:历史教训与未来趋势

在1938年大萧条时期&#xff0c;MIT校长卡尔康普顿讨论了“技术失业”&#xff0c;即因技术进步导致的失业现象。他认为&#xff0c;尽管技术进步会对个别工人和社区产生负面影响&#xff0c;但从整体上看&#xff0c;技术进步创造了更多的就业机会。这一观点在今天依然具有重要…

海南云亿商务咨询有限公司抖音电商服务领军者

在当今这个数字化高速发展的时代&#xff0c;抖音电商已经成为了一种不可忽视的新型商业模式。作为行业的佼佼者&#xff0c;海南云亿商务咨询有限公司凭借其专业团队和卓越的服务能力&#xff0c;为众多商家提供了一站式的抖音电商解决方案&#xff0c;助力商家在竞争激烈的市…

DP学习——简单工厂模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 不同的业务场景下要创建不同的对象&#xff0c;但是这些对象又有共同的特点。如何复用代码呢&#xff1f;你会想到&#xff0c;这些对象可以抽象出一个基类/抽象类就行了&#xff0c;那么随着业…

短视频带货的新趋势:揭秘萤瓴优选智能分镜功能的轻资产另类新风口

随着互联网的飞速发展&#xff0c;短视频平台如雨后春笋般崛起&#xff0c;短视频带货已成为电商领域的新宠。在这个趋势下,萤瓴优选凭借其独特的智能分镜功能&#xff0c;引领了一股轻资产另类新风口&#xff0c;为众多电商从业者带来了新的机遇。本文将深入探讨短视频带货的新…

常见的嵌入式软件体系结构

本文介绍常见的嵌入式软件体系结构。 在嵌入式开发过程中&#xff0c;尤其是MCU为主控的项目开发中&#xff0c;实时性是需要考虑的重要因素&#xff0c;本文介绍常见的2种嵌入式软件体系结构&#xff0c;并对其优缺点作简要分析&#xff0c;另外&#xff0c;还对它们的软件层…

兼容性问题---H5屏幕适配方案

对前端计量单位的理解&#xff1a;px、vw、rem、em、%等&#xff1b; https://www.tiangong.cn/chatShare?share_ide3a157fe37e041de95a2 前端开发中常见的计量单位主要包括以下几种&#xff1a;px (像素): 屏幕显示的最小单位&#xff0c;一个像素表示显示器上一个点的颜色。…