最近帮朋友看了下X264压缩视频,主要参考了雷霄骅(leixiaohua1020)的专栏的开源代码:

http://blog.csdn.net/leixiaohua1020/article/details/42078645

但网上能找到的例子都是把YUV(如I420等)编码为H264的,在编码BITMAP格式的RGB数据之前其实不需要自己转换数据格式,只要把源数据格式指定一下就可以了,X264库可以自动处理。

如下:

int csp=X264_CSP_BGR|X264_CSP_VFLIP;    //这个格式是BITMAP的那种颠倒的BGR的格式

int csp = X264_CSP_I420;        //这个是I420格式

同时也试验了一下X264VFW库,有很多问题(压缩到内存不知道为什么不灵,直接压缩到文件时路径和文件名不支持中文等),不好用,建议大家不要用那个库试验了,X264官网也不推荐这个库。

把雷霄骅的代码也转帖如下,其中加了几条注释:(那篇博文禁止未经许可转载,里面的代码不知道能否随便贴在这里?)

/**
* 最简单的基于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 = fopen("../cuc_ieschool_640x360_yuv444p.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 frame
int frame_num=;
int csp=X264_CSP_I420;
//TOM注释:如果直接压缩bitmap格式的rgb数据,需要修改这句话为int csp=X264_CSP_BGR|X264_CSP_VFLIP;
int width=,height=; int iNal = ;
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)); //Check
if(fp_src==NULL||fp_dst==NULL){
printf("Error open files.\n");
return -;
} x264_param_default(pParam);
         //TOM注释:上面这个缺省参数是two pass模式的选项,如果要实时压缩,需要用one pass模式,这句话修改为:
//x264_param_default_preset(pParam, "veryfast", "zerolatency");
         pParam->i_width   = width;
pParam->i_height = height;
/*
//Param
pParam->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[]); 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 number
if(frame_num==){
fseek(fp_src,,SEEK_END);
switch(csp){
case X264_CSP_I444:frame_num=ftell(fp_src)/(y_size*);break;
case X264_CSP_I420:frame_num=ftell(fp_src)/(y_size*/);break;
default:printf("Colorspace Not Support.\n");return -;
}
fseek(fp_src,,SEEK_SET);
} //Loop to Encode
for( i=;i<frame_num;i++){
switch(csp){
case X264_CSP_I444:{
fread(pPic_in->img.plane[],y_size,,fp_src); //Y
fread(pPic_in->img.plane[],y_size,,fp_src); //U
fread(pPic_in->img.plane[],y_size,,fp_src); //V
break;}
case X264_CSP_I420:{
fread(pPic_in->img.plane[],y_size,,fp_src); //Y
fread(pPic_in->img.plane[],y_size/,,fp_src); //U
fread(pPic_in->img.plane[],y_size/,,fp_src); //V
break;}
default:{
printf("Colorspace Not Support.\n");
return -;}
}
pPic_in->i_pts = i; ret = x264_encoder_encode(pHandle, &pNals, &iNal, pPic_in, pPic_out);
if (ret< ){
printf("Error.\n");
return -;
} printf("Succeed encode frame: %5d\n",i); for ( j = ; j < iNal; ++j){
//TOM注释:如果是one pass模式,在这里保存,two pass模式,iNal为0,这里不会被调用
                             fwrite(pNals[j].p_payload, , pNals[j].i_payload, fp_dst);
}
}
i=;
//flush encoder
while(){
ret = x264_encoder_encode(pHandle, &pNals, &iNal, NULL, pPic_out);
if(ret==){
//TOM注释:如果是one pass 模式,前面已经保存完了,直接在这里break
break;
}
printf("Flush 1 frame.\n");
for (j = ; j < iNal; ++j){
//TOM注释:如果为two pass模式,在这里保存
fwrite(pNals[j].p_payload, , 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 ;
}

X264库直接压缩BITMAP格式数据的更多相关文章

  1. 使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据

     目录 前言 1 Get方式和Post方式接口说明 2 OkHttp库简单介绍及环境配置 3 具体实现 前言 本文具体实现思路和大部分代码参考自<第一行代码>第2版,作者:郭霖:但是文中讲 ...

  2. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  3. 基于GDAL库,读取海洋风场数据(.nc格式)c++版

    经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形.海洋表面温度.盐度.湿度.云场.风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据.本文将以海洋风场数据为例 ...

  4. 使用Javascript/jQuery将javascript对象转换为json格式数据 - 海涛的CSDN博客 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  5. bitmap格式分析(转)

    源:bitmap格式分析 参考:bitmap图像介绍 最近正在着手开发一个图片库,也就是实现对常见图片格式的度写操作.作为总结与积累,我会把这些图片格式以及加载的实现写在我的Blog上. 说到图片,位 ...

  6. Bitmap 格式

    源:Bitmap 格式 参考:bitmap文件格式 Bitmap是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),DDB已经基本停用. Bit ...

  7. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  8. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  9. JMeter学习(三十五)使用jmeter来发送json/gzip格式数据

    一.使用jmeter来发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种情况,会发生在移动终端上. 这样做的好处, 是可以节省流量.  当然, 服务器返 ...

随机推荐

  1. EffectiveJava——请不要在代码中使用原生态类型

    先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public stat ...

  2. xshell 通过ssh连接 ubuntu15_x64

    参考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文乱码在客户端xshell解决:http://jingy ...

  3. Sharepoint2013:在页面上显示错误信息

    在sharepoint2013中我们需要修改以下三处的web.config,以显示错误信息 1, C:\inetpub\wwwroot\wss\VirtualDirectories\端口号\web.c ...

  4. js的querySelector跟querySelectorAll

    querySelector:document.querySelector('.className')------->可以选中.className的一个dom(注意只是一个) document.q ...

  5. jQuery Filterizr 筛选过滤

    Filterizr 是一款功能强大的筛选过滤插件,它提供了多重筛选过滤方式,配合了css3的动画效果. 在线实例 默认 回调函数 使用方法 <div class="sucaihuo&q ...

  6. 移动端图片滚动加载-lazyload实现的要点总结

    最近在做移动端的营销页面时,遇到了页面有大量图片的情况,于是很自然的想到了要使用图片lazyload,PC端用着jQuery,也有现成的插件.但是在移动端,基本不用jQuery,于是就试着自己去造一下 ...

  7. Failed to connect to JobMonApp on port 13491

    今天为了解决别的问题,把/etc/hosts文件里的 127.0.0.1 localhost改成了 127.0.0.1 DSETL ,结果运行作业的时候就报这个错:Failed to connect ...

  8. linux系统免密码登陆

    有两台机器,系统都是CentOS6.5,IP分别为192.168.2.150,192.168.2.151.现在150需要SSH免密码登陆151. 在150上面执行命令,当前登录用户是root: # s ...

  9. OPENGLES 基础(一些链接和随笔)

    http://imgtec.eetrend.com/blog/3912 http://blog.csdn.net/zj8792612/article/details/16116145   在线着色器编 ...

  10. Android压力测试工具——Monkey

    Android压力测试工具——Monkey Monkey是运行在模拟器上和真机设备上的一段程序,它会产生用户事件的一系列伪随机流,比如点击.触摸.手势,还有很多系统级别的事件.Monkey通常是用来做 ...