编码可以简单理解为将连续的图片帧转变成视频流的过程。以H264为例给出编码的代码:

        int  InitEncoderCodec(int width, int height)
{
auto enc = avcodec_find_encoder(AV_CODEC_ID_H264);
encodeContext = avcodec_alloc_context3(enc);
auto codec = encodeContext;
codec->codec_id = enc->id;
codec->time_base.num = ;
codec->time_base.den = ;
codec->gop_size = ;
codec->bit_rate = ;
codec->pix_fmt = AV_PIX_FMT_YUV420P;
codec->width = width;
codec->height = height;
codec->has_b_frames = ;
codec->max_b_frames = ;
AVDictionary* options = nullptr;
if (!av_dict_get(options, "threads", nullptr, ))
{
av_dict_set(&options, "threads", "auto", );
}
auto hr = avcodec_open2(codec,enc,nullptr);
return hr;
}

稍微解释下:AV_CODEC_ID_H264是264 codec ID,如果是其他的编码器替换相应的ID.  avcodec_open2返回0表示打开编码器成功,打开失败返回负值。
encode输入是一个AVFrame。注意:Frame的宽高要与codec的宽高一致。编码后的packet组成PES流。

    shared_ptr<AVPacket> encode(AVFrame* frame)
{
int gotpacket = ;
shared_ptr<AVPacket> packet = nullptr;
shared_ptr<AVPacket> pkt((AVPacket*)av_malloc(sizeof(AVPacket)), [&](AVPacket *p){av_free_packet(p);av_freep(&p);});
av_init_packet(pkt.get());
pkt->data = nullptr;
pkt->size = ; int hr = avcodec_encode_video2(encodeContext, pkt.get(), frame, &gotpacket);
if(hr >= && gotpacket)
{
packet = pkt;
}
return packet;
}

视频下载地址:http://www.chungen90.com/?news_3/

Demo下载地址: http://www.chungen90.com/?news_2

ffmpeg 编码的更多相关文章

  1. ffmpeg编码h264只包含I帧P帧的方法

    ffmpeg使用avcodc_encode_video编码,默认产生的h264包含B帧,在安防行业很多地方是不需要用到B帧的. 1.基础知识充电 这就涉及到h264的各种profile格式了,参考 h ...

  2. 如何强制ffmpeg编码时输出一个关键帧

    http://blog.csdn.net/ashlingr/article/details/7829429 如何强制ffmpeg编码时输出一个关键帧   如何强制ffmpeg编码时输出一个关键帧 AV ...

  3. OpenCV和ffmpeg编码资料分享

    本博也是在进行视频转码的学习道路上,也只是菜鸟一枚,收集了大量的资料,想在这和同路人分享一下 在博园里我发表一个JavaCV的随笔,里面介绍了JavaCV这个框架,它整合了OpenCV和ffmpeg等 ...

  4. 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)

    fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ...

  5. ffmpeg编码YUV420视频序列

    依旧是这里的测试序列 http://www.cnblogs.com/zzugyl/p/3678865.html测试了JM和libx264的编解码质量后来用ffmpeg转码 发现忘记了命令行转码的命令网 ...

  6. 流媒体技术学习笔记之(十五)FFmpeg编码遇到的错误、警告、Debug记录

    When encoding H.264 using ffmpeg I get the following type of warnings en masse: Past duration 0.6063 ...

  7. 使用ffmpeg编码时,如何设置恒定码率,并控制好关键帧I帧间隔

    1. 大家在使用ffmpeg进行视频编码时,使用-b命令,想控制比特率,却发现结果并没有如我们设置所愿,通过码流分析器观察视频码流,码率的波动还是很大的,ffmpeg控制的并不好,这时候,我们可以通过 ...

  8. FFmpeg编码详细流程

    FFmpeg在编码一个视频的时候的函数调用流程.为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数. 函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作 ...

  9. ffmpeg编码常见问题排查方法

    播放问题排查: 一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个: ...

  10. ffmpeg编码

    1. 注册所有容器格式和CODEC:av_register_all()2. 打开文件:av_open_input_file()3. 从文件中提取流信息:av_find_stream_info()4. ...

随机推荐

  1. 深入浅出ExtJS 第六章 布局

       6.1 布局的用途 6.1 布局的用途 //决定把什么东西放到什么位置; var vieport = new Ext.Viewport({ layout:'border', //使用Border ...

  2. CSS3 照片墙

    HTML <body> <h2>照片墙制作</h2> <div class="container"> <img class=& ...

  3. Socket 两平台互相 通信 .NET

    两个平台互相通信,对方发送数据过来,我方接收数据,对数据进行处理后发送结果给对方,对方进行相应的操作. 首页,我方开启服务监听: Socket socket = new Socket(AddressF ...

  4. .NET P****** CMS 逆向工程

    (应一些园友建议,我把敏感字段去掉) 其实当初我的目的是很纯洁的,只是想找一个简单的网站生成模板,由于对.net更熟悉一点,就去搜索了.net框架的CMS,看它的介绍挺强大的,符合最初的目的,但是下下 ...

  5. ASP.NET MVC 4框架揭秘(微软6任MVP,高级软件顾问蒋金楠新作)

    http://www.cnblogs.com/artech/

  6. DynamicObject数据包操作

    DynamicObject的结构非常简单明了,就是一个字典,类似于一个Dictionary<string, object>,其中的object可能是一个简单值(普通字段),可能是一个复杂值 ...

  7. Javascript验证用户输入URL地址是否正确

    <script type="text/javascript">function checkUrl() { var url = document.getElementBy ...

  8. 简单的MySQL数据库主从同步配置

    Master配置: 代码如下 复制代码 log-bin = mysql-binserver-id = 1binlog-do-db = powerdns #要同步的数据库 Master新增slave账号 ...

  9. conditon监视器接口

    conditon监视器接口的实例对象必须通过Lock.newCondition()建立 立

  10. java synchronized关键字浅探

    synchronized 是 java 多线程编程中用于使线程之间的操作串行化的关键字.这种措施类似于数据库中使用排他锁实现并发控制,但是有所不同的是,数据库中是对数据对象加锁,而 java 则是对将 ...