首页 > 其他分享 >.h264 .h265 压缩率的直观感受

.h264 .h265 压缩率的直观感受

时间:2024-07-25 16:26:13浏览次数:10  
标签:h264 h265 frame uv cv2 height width yuv 压缩率

1.资源文件  

https://download.csdn.net/download/twicave/89579327


上面是.264 .265和原始的YUV420文件,各自的大小。

2.转换工具:

2.1 .h264 .h265互转

可以使用ffmpeg工具:Builds - CODEX FFMPEG @ gyan.dev

命令行参数:

ffmpeg -i Tennis1080p.h264 -c:v libx265 -preset medium -crf 28 Tennis1080p.h265 

2.2 .h264 转 yuv

我因为要测试rk3588上一个硬件解码器,使用的是一个.c代码:

mpp-test: Rockchip MPP的简单案例

2.3 yuv file reader

 这个可以使用python直接处理,2.2代码里存储的YUV420SP格式我没有完全解出来,色彩不正:

import cv2
import numpy as np


yuv_frame_pack_file = "Tennis1080p.yuv"

def yuv420sp_to_rgb(yuv420sp_frame, width, height, format='NV21'):
    y_size = width * height
    uv_size = (width * height) // 2

    # 分离 Y 分量
    y = yuv420sp_frame[:y_size].reshape((height, width))
    
    # 分离 UV 分量
    uv = yuv420sp_frame[y_size:y_size + uv_size]
    uv = uv.reshape((height // 2, width))  # UV 分量的宽度为原图的宽度,但高度为一半

    if format == 'NV12':
        u = uv[0::2, :]  # U分量
        v = uv[1::2, :]  # V分量
    elif format == 'NV21':
        v = uv[0::2, :]  # V分量
        u = uv[1::2, :]  # U分量
    else:
        raise ValueError("Unsupported format. Use 'NV12' or 'NV21'.")

    # 将U和V分量上采样到Y的分辨率
    u_upscaled = cv2.resize(u, (width, height), interpolation=cv2.INTER_LINEAR)
    v_upscaled = cv2.resize(v, (width, height), interpolation=cv2.INTER_LINEAR)

    # 合并Y, U, V分量为一个3通道的图像
    yuv_image = np.zeros((height + height // 2, width), dtype=np.uint8)
    yuv_image[:height, :] = y
    yuv_image[height:height + height // 4, :] = u_upscaled[:height // 4, :]
    yuv_image[height + height // 4:, :] = v_upscaled[:height // 4, :]

    # 转换到RGB
    rgb_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2RGB_I420)
    
    return rgb_image


# 设置图像的宽度和高度
width, height = 1920, 1080

# 设置图像的宽度和高度
width, height = 1920, 1080

# 读取一帧YUV420数据
cnt = 23  #控制跳过几帧。视频总帧数可以按照通过文件尺寸测算,YUV420系列一帧是1920*1080*1.5 Bytes.
with open(yuv_frame_pack_file , 'rb') as file:
    while(cnt>0):
        cnt -=1
        yuv420_frame = file.read(width * height * 3 // 2)  # YUV420格式,每帧大小为width * height * 3 / 2
        continue
    yuv420_frame = file.read(width * height * 3 // 2)  # YUV420格式,每帧大小为width * height * 3 / 2
    yuv420_frame = np.frombuffer(yuv420_frame, dtype=np.uint8)
    rgb_frame = yuv420sp_to_rgb(yuv420_frame, width, height)
    cv2.imshow('RGB Image', rgb_frame)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2.3.1解码效果

标签:h264,h265,frame,uv,cv2,height,width,yuv,压缩率
From: https://blog.csdn.net/twicave/article/details/140693183

相关文章

  • H264 NALU
    H.264是一种广泛使用的视频压缩标准,全称是MPEG-4Part10AVC(AdvancedVideoCoding)。它通过有效的压缩技术,能够在较低的比特率下提供高质量的视频。以下是对H.264的一些关键概念和工作原理的详细讲解:1.编码原理H.264采用帧内和帧间预测技术来压缩视频数据。它将视频分为若干......
  • 音视频开发—使用FFmpeg从纯H264码流中提取图片 C语言实现
    文章目录1.H264码流文件解码流程关键流程详细解码流程详细步骤解析2.JPEG编码流程详细编码流程详细步骤解析3.完整示例代码4.效果展示从纯H.264码流中提取图片的过程包括解码和JPEG编码两个主要步骤,以下是详细阐述1.H264码流文件解码流程关键流程查找编解码器......
  • php将png转为jpg,可设置压缩率
    /***将PNG文件转换为JPG文件*@param$pngFilePathstringPNG文件路径*@param$jpgFilePathstringJPG文件路径*@param$qualityintJPG质量,0-100,值越低,压缩率越高*@returnvoid*@throwsException*/functionconvertPngToJpg($pngFilePath,$j......
  • Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264
    一、前言上一篇文章讲到用ffmpeg命令方式执行打印到日志输出,可以拿到本地摄像头设备信息,顺藤摸瓜,发现可以通过执行ffmpeg-fdshow-list_optionstrue-ivideo="Webcam"命令获取指定摄像头设备的分辨率帧率格式等信息,会有很多条。那为什么需要这个功能呢?现场大量应用下来,尽管......
  • openh264 宏块级码率控制源码分析
    openh264宏块级码率控制函数关系宏块级核心函数分析WelsRcMbInitGom函数功能:openh264码率控制框架中宏块级码率控制函数,根据是否启用GOMQP来决定如何设置宏块的QP值,以控制编码的质量和比特率。原理过程:函数参数:pEncCtx:指向编码上下文的指针,包含编码过程中所......
  • openh264 帧级码率控制源码分析
    openh264码率控制结构关于openh264码率控制整体结构,可以参考:openh264码率控制原理框架。openh264帧级码率控制介绍函数关系图:从图可以看出,帧级码控的核心函数就是WelsRcPictureInitGom、WelsRcPictureInfoUpdateGom函数。帧级码率控制核心函数介绍WelsRcPictureI......
  • openh264 帧内预测编码原理:WelsMdI4x4 函数
    介绍功能:针对4x4像素块的帧内模式决策原型:int32_tWelsMdI4x4(sWelsEncCtx*pEncCtx,SWelsMD*pWelsMd,SMB*pCurMb,SMbCache*pMbCache)参数:sWelsEncCtx*pEncCtx:指向编码上下文结构的指针,包含编码过程中需要的状态信息。SWelsMD*pWelsMd:指向运动检测结构的......
  • BK7258--wifi音视频soc芯片,1080P H264 wifi低功耗保活,内置BLE,音频code,psram,flash,USB2.
    BK7258是上海博通推出的高度集成的Wi-Fi+BLE combo音视频芯片,支持UVC和DVP摄像头,该芯片集成音视频外设及接口,1080P,H.264,低功耗,内置flash,dsp,psram,驱屏,回声消除及降噪等,广泛适用于可视猫眼,门锁,门铃,ipc,内窥,儿童相机等应用市场。可视门铃应用:DVP接口支持720p25fps图像采集;MJPE......
  • ffmpeg编码之实现YUV转换成H264
    方法1:命令转换#转换ffmpeg-s720*1280-pix_fmtyuv420p-iinput.yuv-vcodeclibx264-b:v4096k-bf0-g10-r30output.h264#播放ffplayoutput.h264方法2:代码转换 main.c#include"libavutil/log.h"#include"libavutil/avutil.h"#include......
  • ffmpeg提取H264视频数据
    方法1:命令提取ffmpeg-iinput.mp4-an-vcodeccopyout.h264ffmpeg-iinput.mp4-an-vcodeccopy-bsf:h264_mp4toannexbout1.h264方法2:代码提取 main.c#include"libavutil/log.h"#include"libavformat/avformat.h"#include"libavut......