yuv encode h264 test

原始图像

shell.albert@yantai:~/project/H.264/football>ls -l fb001.yuv fb002.yuv fb003.yuv fb011.yuv fb012.yuv fb013.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb001.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb002.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb003.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb011.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb012.yuv

-rw-r--r-- 1shell.albert users 126720 Feb 12 2002 fb013.yuv

合并为一个yuv文件

cat fb001.yuvfb002.yuv fb003.yuv fb011.yuv fb012.yuv fb013.yuv > 123.yuv

shell.albert@yantai:~/libx264>ls -l 123.yuv

-rw-r--r-- 1shell.albert users 760320 Apr 24 14:41 123.yuv

计算尺寸

126720*6=760320

正好对应上。


已知数据源为352x240YUV420格式的,所以一帧的数据量为width*height*3/2

即为350*240*3/2=126720.00

那么最终的数据文件123.yuv中会包含

760320/126720=6.00帧原始的yuv图像。


使用libx264进行yuv2h264编码后,如下

shell.albert@yantai:~/libx264>ls -l 123.yuv libx264123.264

-rw-r--r-- 1shell.albert users 760320 Apr 24 14:41 123.yuv

-rw-r--r-- 1shell.albert users 44376 Apr 24 14:45 libx264123.264

可以数据量差距还是很大的,所以视频图像是需要先进行264编码后,再进行传输,然后再接收解码回显的。

libx264期望原始的yuv420p的数据流输入格式,如果是其他的则需要先进行转换。


如果想进入mjpegpng图像进行h264压缩,那么在此之前必须先将mjpeg转换为原始的yuv图像再送入libx264进行编码。


接收端接收到h264文件,解码为yuv,然后转换为RGB,再使用QImage生成图像,使用QPixmap画到QWidget上面。



libx264只是一个h264编码库,将yuv420的输入编码成h264。没有解码功能,若想将h264解码还原为yuv数据,


则需要使用ffmpeg。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H.264编码是一个复杂的过程,需要涉及许多算法和数据结构,因此编写一个完整的H.264编码库是一个相当复杂的任务。下面是一个简单的示例程序,用于演示如何使用C语言编写一个H.264编码器: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> // 定义H.264编码器结构体 typedef struct { int width; // 视频的宽度 int height; // 视频的高度 int fps; // 视频的帧率 uint8_t *buffer; // 视频帧的缓冲区 int buffer_size; // 视频帧缓冲区的大小 } H264Encoder; // 初始化H.264编码器 H264Encoder* h264_encoder_init(int width, int height, int fps) { H264Encoder* encoder = (H264Encoder*)malloc(sizeof(H264Encoder)); encoder->width = width; encoder->height = height; encoder->fps = fps; encoder->buffer_size = width * height * 3 / 2; encoder->buffer = (uint8_t*)malloc(encoder->buffer_size); return encoder; } // 编码一帧视频 int h264_encoder_encode_frame(H264Encoder* encoder, uint8_t* frame_data, int frame_size) { // TODO: 实现H.264编码过程,将编码后的数据存储到encoder->buffer中 // 注意:编码后的数据大小可能会超过encoder->buffer_size,因此需要进行检查并返回错误码 return 0; } // 关闭H.264编码器 void h264_encoder_close(H264Encoder* encoder) { free(encoder->buffer); free(encoder); } int main() { // 初始化H.264编码器 H264Encoder* encoder = h264_encoder_init(640, 480, 30); // 加载一帧视频数据 FILE* fp = fopen("test.yuv", "rb"); uint8_t* frame_data = (uint8_t*)malloc(encoder->buffer_size); int frame_size = fread(frame_data, 1, encoder->buffer_size, fp); // 编码视频帧 int ret = h264_encoder_encode_frame(encoder, frame_data, frame_size); if (ret != 0) { fprintf(stderr, "Error: H.264 encoding failed.\n"); return -1; } // 关闭H.264编码器 h264_encoder_close(encoder); return 0; } ``` 上述示例程序仅仅是一个简单的框架,其中的TODO注释需要您自己实现H.264编码过程。在实现过程中,您可能需要使用到一些开源的H.264编码库,如x264等。此外,我们还需要注意H.264编码的标准,以便生成符合标准的H.264视频流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值