首页 > 代码库 > 最简单的视频编码器:基于libx264(编码YUV为H.264)

最简单的视频编码器:基于libx264(编码YUV为H.264)

本文记录一个最简单的基于libx264的H.264视频编码器。此前记录的H.264编码器都是基于FFmpeg调用libx264完成编码的,例如:
 《最简单的基于FFMPEG的视频编码器(YUV编码为H.264)》
相比与上文中的编码器,本文记录的编码器属于“轻量级”的编码器。因为它不再包含FFmpeg的代码,直接调用libx264完成编码。因此项目的体积非常小巧。该编码器可以将输入的YUV数据编码为H.264码流文件。
 

流程图

调用libx264进行视频编码的流程图如下所示。

技术分享

流程图中主要的函数如下所示。
x264_param_default():设置参数集结构体x264_param_t的缺省值。
x264_picture_alloc():为图像结构体x264_picture_t分配内存。
x264_encoder_open():打开编码器。
x264_encoder_encode():编码一帧图像。
x264_encoder_close():关闭编码器。
x264_picture_clean():释放x264_picture_alloc()申请的资源。
 
存储数据的结构体如下所示。
x264_picture_t:存储压缩编码前的像素数据。
x264_nal_t:存储压缩编码后的码流数据。

 
此外流程图中还包括一个“flush_encoder”模块,该模块使用的函数和编码模块是一样的。唯一的不同在于不再输入视频像素数据。它的作用在于输出编码器中剩余的码流数据。
 

源代码

/**
 * 最简单的基于X264的视频编码器
 * Simplest X264 Encoder
 *
 * 雷霄骅 Lei Xiaohua
 * leixiaohua1020@126.com
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程序可以YUV格式的像素数据编码为H.264码流,是最简单的
 * 基于libx264的视频编码器
 *
 * This software encode YUV data to H.264 bitstream.
 * It‘s the simplest encoder example based on libx264.
 */
#include <stdio.h>
#include <stdlib.h>
 
#include "stdint.h"
 
#if defined ( __cplusplus)
extern "C"
{
#include "x264.h"
};
#else
#include "x264.h"
#endif
 
 
int main(int argc, char** argv)
{
 
         int ret;
         int y_size;
         int i,j;
 
         //FILE* fp_src  = http://www.mamicode.com/fopen("../cuc_ieschool_640x360_yuv444p.yuv", "rb");>

运行结果

程序的输入为一个YUV文件(已经测试过YUV444P和YUV420P两种格式)。

技术分享

输出为H.264码流文件。

技术分享

H.264码流文件的信息如下所示。

技术分享

下载


Simplest Encoder

 

SourceForge项目主页:https://sourceforge.net/projects/simplestencoder/

CDSN下载地址:http://download.csdn.net/detail/leixiaohua1020/8284105

 
该解决方案包含了几个常见的编码器的使用示例:
simplest_vpx_encoder:最简单的基于libvpx的视频编码器
simplest_x264_encoder:最简单的基于libx264的视频编码器
simplest_x265_encoder:最简单的基于libx265的视频编码器
 
 
 

最简单的视频编码器:基于libx264(编码YUV为H.264)