背景

根据例程学习调用ffmpeg 库方法的时候,发现了一堆警告。

main.cpp:81:37: warning: ‘AVStream::codec’ is deprecated [-Wdeprecated-declarations]
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)

介绍

从FFmpeg 3.0 开始 , 使用了很多新接口,在一些基本用法上,编译会看见很多的warning,类似

“ warning: ‘AVStream::codec’ is deprecated (declared at  /usr/local/ffmpeg/include/libavformat/avformat.h:880)  [-Wdeprecated-declarations]

out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;”

avcodec_decode_video2()

原本的解码函数被拆解为两个函数avcodec_send_packet()avcodec_receive_frame()

具体用法如下:

old:

avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);

new:


avcodec_send_packet(pCodecCtx, pPacket); avcodec_receive_frame(pCodecCtx, pFrame);

avcodec_encode_video2()

对应的编码函数也被拆分为两个函数avcodec_send_frame()和avcodec_receive_packet() 具体用法如下:

old:

avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);

new:

avcodec_send_frame(pCodecCtx, pFrame);

avcodec_receive_packet(pCodecCtx, pPacket);

avpicture_get_size()

现在改为使用av_image_get_size() 具体用法如下:

old:

avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

new:

//最后一个参数align这里是置1的,具体看情况是否需要置1

av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

avpicture_fill()

现在改为使用av_image_fill_arrays 具体用法如下:

old:

avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

new:

//最后一个参数align这里是置1的,具体看情况是否需要置1

av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer,  AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);

关于codec问题有的可以直接改为codecpar,但有的时候这样这样是不对的,所以我也还在探索,这里记录一个对pCodecCtx和pCodec赋值方式的改变

old:

pCodecCtx = pFormatCtx->streams[video_index]->codec;

pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);

new:

pCodecCtx = avcodec_alloc_context3(NULL);

avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar);

pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P

'AVStream::codec': 被声明为已否决:

old:

if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){

new:

if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){

'AVStream::codec': 被声明为已否决:

old:

pCodecCtx = pFormatCtx->streams[videoindex]->codec;

new:

pCodecCtx = avcodec_alloc_context3(NULL);

avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);

'avpicture_get_size': 被声明为已否决:

old:

avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)

new:

#include "libavutil/imgutils.h"

av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1)

'avpicture_fill': 被声明为已否决:

old:

avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

new:

av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize, out_buffer, AV_PIX_FMT_YUV420P,

pCodecCtx->width, pCodecCtx->height, 1);

'avcodec_decode_video2': 被声明为已否决:

old:

ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,  packet); //got_picture_ptr Zero if no frame could be decompressed

new:

ret = avcodec_send_packet(pCodecCtx, packet);

got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned

//注意:got_picture含义相反

或者:

int ret = avcodec_send_packet(aCodecCtx, &pkt);

if (ret != 0)

{

prinitf("%s/n","error");

return;

}

while( avcodec_receive_frame(aCodecCtx, &frame) == 0){

//读取到一帧音频或者视频

//处理解码后音视频 frame

}

'av_free_packet': 被声明为已否决:

old:

av_free_packet(packet);

new:

av_packet_unref(packet);

avcodec_decode_audio4:被声明为已否决:

old:

result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt);

new:

int ret = avcodec_send_packet(dec_ctx, &enc_pkt);

if (ret != 0) {

    prinitf("%s/n","error");

}

while( avcodec_receive_frame(dec_ctx, &out_frame) == 0){

    //读取到一帧音频或者视频

    //处理解码后音视频 frame
}

error: ‘avcodec_alloc_frame’ was not declared in this scope

old:

pFrame = avcodec_alloc_frame();

new:

pFrame = av_frame_alloc();

avpicture_get_size:被声明为已否决:

old:

numBytes = avpicture_get_size(AV_PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);

new:

/**
* @deprecated use av_image_get_buffer_size() instead.
*/
attribute_deprecated
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);

‘av_close_input_file’ was not declared in this scope

old :

av_close_input_file(pFormatCtx);

new:

avformat_close_input(&pFormatCtx);

FFmpeg新旧接口对照使用一览的更多相关文章

  1. MapReduce简述、工作流程及新旧API对照

    什么是MapReduce? 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查而且数出有多少张是黑桃. MapReduce方法则是: 1. 给在座的全部玩家中分配这摞牌. 2. 让每一个玩家数自己手 ...

  2. ffmpeg新老接口对比

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

  3. Hadoop日记Day15---MapReduce新旧api的比较

    我使用hadoop的是hadoop1.1.2,而很多公司也在使用hadoop0.2x版本,因此市面上的hadoop资料版本不一,为了扩充自己的知识面,MapReduce的新旧api进行了比较研究. h ...

  4. [转帖]InfluxDB 1.2.0安装及新旧版本的注意事项

    InfluxDB 1.2.0安装及新旧版本的注意事项 http://haibing.org/245?zwlqby=npztq3 挺好的文章 很好的解决了 上一个文档里面 关于 web admin 的问 ...

  5. Android新旧版本Notification

    Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...

  6. Matlab神经网络函数newff()新旧用法差异

    摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...

  7. [ACM_数学] Taxi Fare [新旧出租车费差 水 分段函数]

    Description Last September, Hangzhou raised the taxi fares. The original flag-down fare in Hangzhou ...

  8. Flex布局新旧混合写法详解(兼容微信)

    原文链接:https://www.usblog.cc/blog/post/justzhl/Flex布局新旧混合写法详解(兼容微信) flex是个非常好用的属性,如果说有什么可以完全代替 float 和 ...

  9. Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口

    Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口.Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...

  10. 浅谈 angular新旧版本问题

    一直在学习angularJs,之前用的版本比较老,前些天更新了一下angularJs的版本,然后发现了一些问题,希望和大家分享一下. 在老的版本里控制器直接用函数定义就可以 比如: 在angularJ ...

随机推荐

  1. vue-单独引入css文件,设置公共的css样式或者修改默认的vant,mint样式

    1.css文件夹下新建global.css文件并粘贴复制: ======================= :root{     --bgColor : #d3252a;     --pinkColo ...

  2. linux-centos7.6-gpt-uefi安装

    目录 linux-centos7.6-gpt-uefi安装 一.需要 二.环境 三.vm新建虚拟机系统环境 四.开始安装 linux-centos7.6-gpt-uefi安装 一.需要 安装的系统适用 ...

  3. 09. rails 创建user用户列表

    gem添加分页的依赖 #列表分页 gem 'will_paginate', '~> 3.0.pre2' bundle 安装依赖 用户列表控制器 before_filter :auth_user, ...

  4. 关于ESLint: Delete `␍`(prettier/prettier) 错误解决方案(3种)

    1.点击VSCode右下角LF/CRLF然后根据弹窗修改成LF即可 2.在.eslintrc.cjs中增加配置 "rules": { "prettier/prettier ...

  5. PAT 练习2-3 输出倒三角图案

    结果: 本题要求编写程序,输出指定的由"*"组成的倒三角图案. 输入格式: 本题目没有输入. 输出格式: 按照下列格式输出由"*"组成的倒三角图案. 一般都用的 ...

  6. C 语言编程 — 代码规范

    目录 文章目录 目录 前文列表 空行 空格 缩进 对齐 代码行 注释 示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 ...

  7. 常回家看看之off_by_one

    off_by_one这个漏洞比较特殊,它不像上一期的堆溢出,可以溢出很多字节,它只能溢出一个字节,在栈里面也可以通过这个漏洞修改返回地址什么的,在堆里面我们主要利用它来修改堆块的大小,形成fake_c ...

  8. springboot使controller异步调用

    调用controller方法,遇到操作时间很长的情况下,不希望前端一直等待操作,而希望前端立马接收到操作启动的反馈,而真正的操作在后端执行,需要用到异步调用的方法.实现步骤如下: 一.配置异步支持: ...

  9. MD5计算,一个扩展类,哪里都能用

    最近有同学问到如何计算一个字节数组的MD5值,现在分享一个扩展类,有了它,MD5计算再也不用其他了. 先看示例: string s = "hello world"; var s_m ...

  10. MyBatis实现MySQL表字段及结构的自动增删

    前言 在开发过程中,总会涉及到数据库表结构字段的增加或者删除,或者是索引的增加和减少,这个时候能把修改表结构字段这些工作都交给程序来进行,那能大大方便开发.正好有一个现成的工具可以在springboo ...