QT x264

废了我4天总算在win平台下 QT上实现x264编码成功,对于那个bug 认为还是要先了解程序的原理才好排错,但是正是这个bug让我学到了很多,学会了如何可以将lib编译成可以包含调试信息,学会了在VS下反编码,学会了extern "C" 的作用,学会了VS里面牛b的汇编编码……

第一步  

windows下编译配置x264 :http://blog.csdn.net/liushu1231/article/details/8936894

第二步 编译源码 http://blog.csdn.net/liushu1231/article/details/9203239


上面两步带我走进了x264编码谢谢那个作者:一个健忘症患者的记忆备份

下面才是我学习中的一点bug:

1 注意那个y4m.c 文件在上面那个博客里面

2 那个程序我修改了如下:可以直接复制(我的平台 win64  QT5.3.1  库x264-snapshot-20140803-2245)y4m.c用那个作者的

\
#include <QCoreApplication>
#include "stdint.h"//处理字符定义的 //stdint.h是c99中引进的一个标准C库的头文件.
extern "C"
{
#include <assert.h>
#include "x264.h"
#include "x264_config.h"
#include "y4m.c"
}
#include "iostream"
#include "time.h"
using namespace std;


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int iResult = 0;
    x264_t* pX264Handle   = NULL;               //编码器句柄


    x264_param_t* pX264Param = new x264_param_t;//x264_param_t为结构体的名字,见文件X264.h
    // x264_param_default(pX264Param);
    assert(pX264Param);
    //* 配置参数
    //* 使用默认参数,在这里因为我的是实时网络传输,所以我使用了zerolatency(零延迟)的选项,使用这个选项之后就不会有delayed_frames,如果你使用的不是这样的话,还需要在编码完成之后得到缓存的编码帧
    int res=x264_param_default_preset(pX264Param,"veryfast" , "zerolatency");//"veryfast"
    //* cpuFlags
   // pX264Param->i_threads  = X264_SYNC_LOOKAHEAD_AUTO;//* 取空缓冲区继续使用不死锁的保证.
    //* 视频选项
    pX264Param->i_width   = 384; //* 要编码的图像宽度.
    pX264Param->i_height  = 288; //* 要编码的图像高度
    pX264Param->i_frame_total = 0; //* 编码总帧数.不知道用0.
    pX264Param->i_keyint_max = 10;
    //* 流参数
    pX264Param->i_bframe  = 5;
    pX264Param->b_open_gop  = 0;
    pX264Param->i_bframe_pyramid = 1;
    pX264Param->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;
    //* Log参数,不需要打印编码信息时直接注释掉就行
    pX264Param->i_log_level  = X264_LOG_DEBUG;
    //X264_LOG_NONE
    //* 速率控制参数
    pX264Param->rc.i_bitrate = 1024 * 10;//* 码率(比特率,单位Kbps)
    //* muxing parameters
    pX264Param->i_fps_den  = 1; //* 帧率分母
    pX264Param->i_fps_num  = 10;//* 帧率分子
    pX264Param->i_timebase_den = pX264Param->i_fps_num;
    pX264Param->i_timebase_num = pX264Param->i_fps_den;

    //* 设置Profile.使用Baseline profile
   int res2= x264_param_apply_profile(pX264Param, x264_profile_names[0]);

    //* 编码需要的辅助变量
    int iNal = 0;         //修改部分
    x264_nal_t *pNals = NULL;    //修改部分
    x264_picture_t* pPicIn = new x264_picture_t;
    x264_picture_t* pPicOut = new x264_picture_t;
    x264_picture_init(pPicOut);                                                           //输出图像的初始化
     int res3= x264_picture_alloc(pPicIn, X264_CSP_I420, pX264Param->i_width, pX264Param->i_height); //输入图像分配数据
    pPicIn->img.i_csp = X264_CSP_I420;                                                    //设置初始化图片格式 YUV420p
    pPicIn->img.i_plane = 3;                                                              //用于保存YUV分量

    //* 打开编码器句柄,通过x264_encoder_parameters得到设置给X264
    //* 的参数.通过x264_encoder_reconfig更新X264的参数

     pX264Handle = x264_encoder_open(pX264Param);
     cout<<"pX264Param:"<<sizeof(pX264Param)<<endl;
    assert(pX264Handle);

    //* 创建文件,用于存储编码数据
    FILE* pFile = fopen("test.264", "wb");
    assert(pFile);
    //设置y4m文件参数
   y4m_input_t *y4m_hnd = (y4m_input_t*)malloc(sizeof(y4m_input_t));
   //打开y4m文件
   iResult = open_file_y4m("example1_352x288.y4m",(hnd_t**)&y4m_hnd,pX264Param);
   if(iResult < 0 )
   {

       printf("Failed to open file y4m!\n");
       system("PAUSE");
       return 0;
   }
   //得到文件总得帧数
   int nFrames = ::get_frame_total_y4m((hnd_t*)y4m_hnd);//9150
   cout<<"*************"<<nFrames<<"*************"<<endl;

   //printf( "start: %ld ms\n", start );

   //开始编码

   for(int i = 0; i < nFrames;i++ )
   {


       //读取一帧
   //	 i++;
       read_frame_y4m(pPicIn,(hnd_t*)y4m_hnd,i);
       if( i ==0 )
           pPicIn->i_pts = i;
       else
           pPicIn->i_pts = i - 1;

       //编码
       int frame_size = x264_encoder_encode(pX264Handle,&pNals,&iNal,pPicIn,pPicOut);
       cout<<"frame_size"<<frame_size<<endl;
       if(frame_size >0)
       {

           for (int i = 0; i < iNal; ++i)
           {//将编码数据写入文件.
               fwrite(pNals[i].p_payload, 1, pNals[i].i_payload, pFile);
           }
       }
   }




   //}

    //* 清除图像区域
   // x264_picture_clean(pPicIn);
    //* 关闭编码器句柄
   // x264_encoder_close(pX264Handle);
    pX264Handle = NULL;
    delete pPicIn ;
    pPicIn = NULL;
    delete pPicOut;
    pPicOut = NULL;
    delete pX264Param;
    pX264Param = NULL;
    return a.exec();
}
  我的修改部分:

    //* 视频选项
    pX264Param->i_width   = 384; //* 要编码的图像宽度.
    pX264Param->i_height  = 288; //* 要编码的图像高度
<pre name="code" class="cpp"> //* 编码需要的辅助变量
    int iNal = 0;         //修改部分
    x264_nal_t *pNals = NULL;    //修改部分

如果想单步调试进源码时
用这句话

 configure--enable-shared  --enable-debug 

替代

configure--enable-shared

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿里等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值