调用libx264进行视频编码的基本流程图

(1)要调用x264库,首先要加上头文件#include <x264.h>,为了方便后面的操作,定义了一个结构体Encoder,定义Encoder *en,此后的操作都会围绕*en进行相关操作。

typedef struct
{x264_param_t *param;//参数结构体x264_t *handle;//压缩器句柄x264_picture_t *picture; //存储压缩编码前的像素数据。x264_nal_t *nal;//存储压缩编码后的码流数据
} Encoder;

在定义了结构体Encoder的指针过后需要给param和picture分配空间,将存储压缩编码前的像素数据类型设置为YUV420 planar数据。

en->param = (x264_param_t *) malloc(sizeof(x264_param_t));

en->picture = (x264_picture_t *) malloc(sizeof(x264_picture_t));

x264_picture_alloc(en->picture,X264_CSP_I420,en->param->i_width,en->param->i_height);

en->picture->img.i_csp = X264_CSP_I420;

en->picture->img.i_plane = 3;

(2)然后初始化编码器,用x264_param_t设置压缩图片的参数。并使用函数x264_encoder_open打开压缩编码器,返回的对象给en->handle。

x264_param_default(en->param); //设置默认参数

en->param->i_width = width; //设置帧宽

en->param->i_height = height; //设置帧高

en->param->i_fps_num = 5; //帧率分子

en->param->i_fps_den = 1; //帧率分母

x264_param_apply_profile(en->param, x264_profile_names[0]); //使用baseline

if ((en->handle = x264_encoder_open(en->param)) == 0) {......}

用摄像头采集到的一帧图片的类型为YUV422,要将其进行压缩要讲YUV422的数据转换为YUV420P。YUV420P是plane类型的数据,顾名思义就是将Y,U,V分别存放在不同平面。由像素信息排列介绍可知YUV422和YUV420P的转换,将交错类型转换为平面类型只需要将亮度,色差信号分别存入不同的平面中,en->picture->img.plane[0]存亮度数据,en->picture-> img.plane[1]、en->picture->img.plane[2]分别存色差数据。至于422转换为420时,Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。

YUV422的数据转换为YUV420P

 char *y = en->picture->img.plane[0];char *u = en->picture->img.plane[1];char *v = en->picture->img.plane[2];int width=en->param->i_width;int height=en->param->i_height;int widthStep422 = width * 2;for(i = 0; i < height; i += 2){p422 = in + i * widthStep422;for(j = 0; j < widthStep422; j+=4){*(y++) = p422[j];*(u++) = p422[j+1];*(y++) = p422[j+2];}p422 += widthStep422;for(j = 0; j < widthStep422; j+=4){*(y++) = p422[j];*(v++) = p422[j+3];*(y++) = p422[j+2];}}

(3)转换为YUV420P的数据在en->picture中,下面就可以调用压缩器句柄进行压缩了,压缩完后的码流数据存在x264_nal_t中。

if (x264_encoder_encode(en->handle, &(en->nal), &nNal, en->picture,&pic_out) < 0) {......}

for (i = 0; i < nNal; i++) {.

.....//这里可以进行操作,将码流取出

}

(4)结束视频压缩,通过句柄关闭压缩编码器,释放相关资源,包括存储振数据的类和最初定义的结构体。

x264_picture_clean(en->picture);

free(en->picture);

free(en->param);

x264_encoder_close(en->handle);

free(en)

libx264进行视频编码的流程相关推荐

  1. x264源码分析与应用示例(一)——视频编码基本流程

    本文包含以下内容 1.H.264编码流程详述与对应x264源码解析 首先简单介绍一下x264源码调试与修改的基本方法.就是基本的conifigure和make,configure命令使用最简单的就可以 ...

  2. 视频编码中为什么须要进行变换编码?

    绝大多数图像都有一个共同的特征:平坦区域和内容缓慢变化区域占领一幅图像的大部分,而细节区域和内容突变区域则占小部分.也能够说,图像中直流和低频区占大部分,高频区占小部分.这样,空间域的图像变换到频域或 ...

  3. FFMpeg 实现视频编码、解码

    FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码.解码.封装.解封装.转码.缩放以及添加水印 ...

  4. 【FFmpeg】使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 [FFmpeg]FFmpeg 相关术语简介 二 [FFmpe ...

  5. 解决Ubuntu16.04视频编码出现Unknown encoder 'libx264'问题

    解决Ubuntu16.04视频编码出现Unknown encoder 'libx264'问题 一.问题原因分析 二.下载xlib264库 三.重新编译安装ffmpeg 四.修改配置文件 这个破问题真的 ...

  6. 毕设系列之Libx264实时视频流(YUV 420P转H264视频编码篇)

    #PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 开发环境:Ubuntu 16.04 LTS 本文的技术实现部分参考雷博 ...

  7. OBS视频数据输出流程(模块加载,编码,推流)详细说明

    声明:本文章内容仅代表个人观点,不能保证完全的正确性,仅供参考! 先上个自己画的图,结合流程图和文字解释,理解起来会更快些 1.视频输出初始化程序运行时,初始化OBS,视频相关的初始化是再mainWi ...

  8. FFmpeg简单使用:视频编码 ---- YUV转H264

    基本流程 从本地读取YUV数据编码为h264格式的数据,然后再存⼊到本地,编码后的数据有带startcode. 与FFmpeg 示例⾳频编码的流程基本⼀致. 函数说明: avcodec_find_en ...

  9. 【视频编码】ffmpeg压缩视频文件

    一.引言 首先,了解下播放视频的基本流程,如下图所示: 解封装:就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据.如上图,将MP4和FLV格式解封装成视频数据H264.MPE ...

最新文章

  1. spring获取bean的方案
  2. 邮件整体解决方案_面向未来的冻干机进出料解决方案:阿尔法(ALUS)系列自动进出料系统...
  3. The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0
  4. 入职3个月的Java程序员面临转正,挑战大厂重燃激情!
  5. 页面无刷新ajax上传文件--模拟iframe,超简单
  6. 利用SecureCRT上传、下载文件(使用sz与rz命令)
  7. 数据结构中基本查找算法总结
  8. c语言周林答案,C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt...
  9. openstack密钥对_您对OpenStack了解多少?
  10. linux ftp指定下载文件名称,linux中通过FTP下载指定的文件方法linux网页制作 -电脑资料...
  11. 安装apk出现Parse error when parsing manifest. Discontinuing installation.解决方案
  12. python程序设计简明教程课后答案_Python简明教程最后的练习题
  13. 2019长江课堂作业答案_2019版长江课堂作业答案语文四年级
  14. Python实现英文词频统计:以hamlet为例
  15. 四十一、Fluent初学者学习流程
  16. C# Graphics类详解
  17. DINO: 让目标检测拥抱Transformer!霸榜COCO!
  18. div上下切换(新增、删除、上下div切换)
  19. C#图片截取压缩(百分比压缩/大小压缩)实现代码
  20. 关闭localized intellij idea切换语言提醒

热门文章

  1. 使用mysqldump备份
  2. 虚拟化基础架构Windows 2008篇之2-域用户与域用户组管理
  3. Am335x lcd驱动分析
  4. 微信开发七(配置js-SDK,步骤2)
  5. Loadrunner中对中文进行UTF-8转码的探索
  6. rabbitmq监控queue中message数量
  7. GDI+中发生一般性错误的解决办法(转帖)
  8. PowerDesigner(三)-企业架构模型
  9. 宿州学院省二计算机什么时候报名,宿州学院2017年9月全国计算机等级考试报名时间及报名网址公布...
  10. 使用计算机效果不理想的应用,有效提高计算机应用课程教学效果的方法探究.doc...