x264编码器,提供了两个demo来验证编码功能:一个是大而全的x264.c,另外一个是简洁版的example.c。

  其中,前者demo,可以配置很多编码参数,但太冗长繁杂,对初学者不太友好。

   后者demo,大多参数都已hard code,用户仅需调整width、height、color_space信息即可,阅读起来比较easy。

  但是存在一个问题,默认输入/输出文件是stdin/stdout,这怎么能行?因此修改了一版来方便大家使用。已上传至这儿

  修改部分需要做几点说明:

1. sps/pps头补加方式:param.b_repeat_headers

  原生方式,在每个关键帧前编码器都会自动增加该头信息(因为设置值为1)。而实际上,一般编码参数配置了后(不需送yuv帧),

就可以出该csd(Codec Specific Data,对于h264为sps/pps)数据了,不需每个关键帧前都加该头信息,因此我将该值修改为了0。

2. 基于1的修改,需要增加特定接口获得csd数据。

  该特定接口函数为x264_encoder_headers(h, &nal, &i_nal),打开编码器后,直接调用该接口就可以获得csd数据。

针对该接口,需要补充说明一点,函数返回后i_nal值代表多少个nalu单元,这里的值是3,即SPS+PPS+SEI共三种类型。

3. profile级别设定:x264_param_apply_profile

  原生profile为“high”,其实我比较排斥B帧,因此修改为了baseline,因为规范中只有该profile不带B帧。

4. 固定关键帧间隔 or 根据场景自动生成

  原生方式为根据场景变换来生成一个关键帧,因此什么时候来KeyFrame是不确定的。其实,这种方式有其很强的合理性。

  什么场景使用x264编码器?一般是视频剪辑,而不是像具体手持设备实时编码场景(场景画面变化是物理连续、渐进的),

  因此,常常会出现场景切换,这个时候最合理的方案是切换后的第一帧,编码为关键帧,当然前提条件是需要一定算法去检测到场景变化了!

  而我的需求是:需要出固定关键帧间隔!怎么做呢?编码参数进行如下配置:

1 param.i_keyint_max = 25;
2
3 param.i_keyint_min = 25;

  然而,这样做起作用了吗?

  答案可能不是那么干脆利索,不能简单用“是”或“否”来回答,只能用“几乎是”,呵呵。。。

  详细说来,如果图像帧序列画风比较平稳,没有大变天,那么就会按照25的关键帧间隔编码;

  而如果遇到画风大变,就会智能地编出关键帧,然后以该帧为起点再按25的关键帧间隔出帧,直到下一次画风大变。

x264编码demo定制修改介绍的更多相关文章

  1. Android camera采集视频 X264编码

    参考 http://blog.csdn.net/zblue78/article/details/6058147 感谢 ExperiencesOfCode 硬件平台:CPU Intel G630 @2. ...

  2. TFS中工作项的定制-修改面板

    上一篇文章我们讲到了<TFS 中工作项的订制-修改工作流>,工作流只要我们设计出来,就可以进行定制修改了.这次通过简单的案例,了解一下,工作项的面板如何定制.     1.软件准备     ...

  3. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  4. 查看 postgresql 数据库编码,以及修改数据库编码

    查看数据表编码: \encoding 修改数据库编码: update pg_database set encoding = pg_char_to_encoding('UTF8') where datn ...

  5. x264编码的图像出现乱码的问题

    将YUV进行x264编码的时候,建议将 i_threads 参数设置成 X264_SYNC_LOOKAHEAD_AUTO//* 取空缓冲区继续使用不死锁的保证. 否则有可能编码出来的数据会出现IDR_ ...

  6. X264编码流程详解(转)

    http://blog.csdn.net/xingyu19871124/article/details/7671634 对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如 ...

  7. 视频x264编码浅析

    声明 x264_param_t 结构体变量: x264_param_t params; x264_param_default_preset(&params, "ultrafast&q ...

  8. 使用良好的自定义X264编码,取得极佳质量!《转》

    原帖地址:http://www.xspliter.com/forum.php?mod=viewthread&tid=447 一般直播时使用A设定即可.你尝试设置并找出你最满意的设定 A为最需最 ...

  9. day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍

    day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...

随机推荐

  1. CentOS7.X 下安装MySQL8.0(附文件)

    这是64位的安装包.如果需要32位的可以去官网下载哦.步骤一样 1 获取安装资源包 mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.b ...

  2. C语言讲义——全局变量和局部变量

    局部变量 普通的局部变量也叫动态变量,默认有个关键字叫auto,可以省略.有两种形式: 1.函数内的局部变量 2.复合语句内的局部变量:for(int i = 0; i<5; i++){-} 静 ...

  3. Java集合【2】--iterator接口详解

    目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...

  4. 06_Intent和IntentFilter

    Intent是同一个或不同的应用中的组件之间的消息传递的媒介,是一个将要执行动作的抽象描述,一般来说是作为参数来使用. Intent描述要启动的基本组件: IntentFilter对组件进行过滤. 下 ...

  5. oracle sql%notfound

    SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...

  6. 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer

    基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...

  7. 浅尝 Elastic Stack (二) Logstash

    一.安装与启动 Logstash 依赖 Java 8 或者 Java 11,需要先安装 JDK 1.1 下载 curl -L -O https://artifacts.elastic.co/downl ...

  8. 第15.32节 PyQt(Python+Qt)入门学习:containers容器类部件QToolBox工具箱介绍及使用案例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  9. 第9.9节 Python文件随机读写定位操作方法seek

    类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...

  10. SUCTF pythonigx

    0x00知识点 nginx配置 配置文件存放目录:/etc/nginx主配置文件:/etc/nginx/conf/nginx.conf管理脚本:/usr/lib64/systemd/system/ng ...