/*** 最简单的基于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"
#endifint main(int argc, char** argv)
{int ret;int y_size;int i,j;//FILE* fp_src  = fopen("../test420.yuv", "rb");FILE* fp_src  = fopen("../cuc_ieschool_640x360_yuv420p.yuv", "rb");FILE* fp_dst = fopen("cuc_ieschool.h264", "wb");//Encode 50 frame//if set 0, encode all frameint frame_num=10;int csp=X264_CSP_I420;//int width=640,height=360;int width = 960, height = 1280;int iNal   = 0;x264_nal_t* pNals = NULL;x264_t* pHandle   = NULL;x264_picture_t* pPic_in = (x264_picture_t*)malloc(sizeof(x264_picture_t));x264_picture_t* pPic_out = (x264_picture_t*)malloc(sizeof(x264_picture_t));x264_param_t* pParam = (x264_param_t*)malloc(sizeof(x264_param_t));//Checkif(fp_src==NULL||fp_dst==NULL){printf("Error open files.\n");return -1;}x264_param_default(pParam);pParam->i_width   = width; pParam->i_height  = height;//ParampParam->i_log_level  = X264_LOG_DEBUG;pParam->i_threads  = X264_SYNC_LOOKAHEAD_AUTO;pParam->i_frame_total = 0;pParam->i_keyint_max = 10;pParam->i_bframe  = 5;pParam->b_open_gop  = 0;pParam->i_bframe_pyramid = 0;pParam->rc.i_qp_constant=0;pParam->rc.i_qp_max=0;pParam->rc.i_qp_min=0;pParam->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;pParam->i_fps_den  = 1; pParam->i_fps_num  = 25;pParam->i_timebase_den = pParam->i_fps_num;pParam->i_timebase_num = pParam->i_fps_den;pParam->i_csp=csp;x264_param_apply_profile(pParam, x264_profile_names[5]);pHandle = x264_encoder_open(pParam);x264_picture_init(pPic_out);x264_picture_alloc(pPic_in, csp, pParam->i_width, pParam->i_height);//ret = x264_encoder_headers(pHandle, &pNals, &iNal);y_size = pParam->i_width * pParam->i_height;//detect frame numberif(frame_num==0){fseek(fp_src,0,SEEK_END);switch(csp){case X264_CSP_I444:frame_num=ftell(fp_src)/(y_size*3);break;case X264_CSP_I420:frame_num=ftell(fp_src)/(y_size*3/2);break;default:printf("Colorspace Not Support.\n");return -1;}fseek(fp_src,0,SEEK_SET);}//Loop to Encodefor( i=0;i<frame_num;i++){switch(csp){case X264_CSP_I444:{fread(pPic_in->img.plane[0],y_size,1,fp_src); //Yfread(pPic_in->img.plane[1],y_size,1,fp_src); //Ufread(pPic_in->img.plane[2],y_size,1,fp_src); //Vbreak;}case X264_CSP_I420:{fread(pPic_in->img.plane[0],y_size,1,fp_src);  //Yfread(pPic_in->img.plane[1],y_size/4,1,fp_src);   //Ufread(pPic_in->img.plane[2],y_size/4,1,fp_src);   //Vbreak;}default:{printf("Colorspace Not Support.\n");return -1;}}pPic_in->i_pts = i;ret = x264_encoder_encode(pHandle, &pNals, &iNal, pPic_in, pPic_out);if (ret< 0){printf("Error.\n");return -1;}printf("Succeed encode frame: %5d\n",i);for ( j = 0; j < iNal; ++j){fwrite(pNals[j].p_payload, 1, pNals[j].i_payload, fp_dst);}}i=0;//flush encoderwhile(1){ret = x264_encoder_encode(pHandle, &pNals, &iNal, NULL, pPic_out);if(ret==0){break;}printf("Flush 1 frame.\n");for (j = 0; j < iNal; ++j){fwrite(pNals[j].p_payload, 1, pNals[j].i_payload, fp_dst);}i++;}x264_picture_clean(pPic_in);x264_encoder_close(pHandle);pHandle = NULL;free(pPic_in);free(pPic_out);free(pParam);fclose(fp_src);fclose(fp_dst);return 0;
}

雷神的 h264 编码例子相关推荐

  1. 海思Hi3519A 进行4k60 h264编码帧率不足的问题

    <!---title:海思Hi3519A 进行4k60 h264编码帧率不足的问题--> <!---keywords:海思,hi3519A, 4k60, h264--> 原始引 ...

  2. Android音视频【一】H264编码基础

    人间观察 岁月催人,时间过的太快了 音视频编码解码就是指通过特定的压缩/解压技术,将某个音视频格式的数据转换为另一种音视频格式数据.目前在Android中的音视频用的最多的就是H264+aac的方式进 ...

  3. H264编码原理(无损压缩)

    无损压缩 DCT变换 经过有损压缩后的数据是分散在二维图标中的各个节点上,数据比较分散时不利于压缩,通过DCT变换,所有的分散数据都被集中在一块,左上角右下角等等. DCT可以将数据由分散变为集中,利 ...

  4. 音视频开发系列-H264编码原理

    H264简介 来自百度百科的介绍: H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式. H.264是ITU-T以H.26x系列为名称命名的 ...

  5. H264编码基本原理(一)

    H264编码基本原理(一) 一.前言 二.H264相关概念 2.1 序列 2.2 帧类型 2.3 GOP(画面组) 2.4 IDR帧(关键帧) 三.H264压缩方式 3.1 压缩方式说明 四.H264 ...

  6. H264编码系列之profile level控制

    Sequence Paramater Set(SPS)(序列参数集) (1). profile_idc: 标识当前H.264码流的profile.我们知道,H.264中定义了三种常用的档次profil ...

  7. H264 编码基本原理

    1 H264 简介 H.264,同时也是 MPEG-4 第十部分,是由 ITU-T 视频编码专家组(VCEG)和 ISO/IEC 动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint V ...

  8. 超越苹果索尼 艾诺兼容H264编码全格式视频

    发展到现在,H.264编码视频凭借优秀的画面质量,逐渐成为视频编码领域的无冕之王,众多视频压制小组和视频下载网站都将H264编码的视频作为高清爱好者的必然选择,其资源占有率逐渐向着RMVB.AVI等前 ...

  9. h264编码与视频丢帧丢包,目标拖影,区域颜色丢失

    下面是我抄的,我和一个海康的工程师聊过,大概意思和下面一样.下面写的很细,值得借鉴. 1.丢帧的出现 说起视频播放器大家都很熟悉了,覆盖各种平台,使用简单操作方面,但是视频播放器里面的原理却非常的复杂 ...

最新文章

  1. 还在为入门深度学习发愁吗?其实你只需要一周的时间
  2. ClickHouse系列教程八:从一个服务器导入4T数据到另外一个服务器
  3. 暗通道去雾算法 python实现
  4. 计算机技术类社团纳新笔试题示例
  5. 可编辑选择、删除条目的ListView
  6. javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册
  7. JSON Web Token (JWT),服务端信息传输安全解决方案
  8. JDK1.8使用Dubbo时需注意
  9. python中range的用法_python的range怎么使用
  10. VS2008程序发布的环境配置
  11. 使用js实现复选框的全选、取消功能
  12. python_numpy_矩阵乘法multiply()、dot()、 matmul()、 * 、 @ 辨析
  13. 数学-线性代数:线性代数
  14. 【蓝桥杯】2019年第十届蓝桥杯(个人赛) 大赛介绍、注意事项及赛后总结
  15. python聊天智能回复_【微信】设置自动回复消息和智能聊天
  16. Max-Margin Regularization for Chamfer Matching
  17. 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
  18. 物料清单的重构———虚项
  19. k8s安装tekton,编写task
  20. 百度普通收录API提交报错:site init fail

热门文章

  1. STM32之IIC通讯升级版--SHT30温湿度读取
  2. 互联网晚报 | 11月6日 星期六 | 海尔创始人张瑞敏辞任董事局主席;海底捞将逐步关停300家门店;杭州亚运会设8个电竞项目...
  3. python 解压zip密码正确但解压失败,Python实现加密的ZIP文件解压(密码已知
  4. QT-C++二维码生成工具(支持中文等任何字符的使用)
  5. java fixflow流程设计_Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍
  6. 相册图片防盗链破解(如:在外部也能显示qq、163或百度空间图片)
  7. 微信小程序上传gitee
  8. 区块链教程Fabric1.0源代码分析配置交易-生成通道配置二
  9. 关于delete this
  10. RK3566调整LCD的背光PWM通道