ffmpeg 新老接口问题及对照集锦

ffmpeg源码包里面有个apichangs文档,里面有各种接口改变的记录,如果你发现接口不能用了,可以去搜索那个文档,可以找到对应的新接口,然后到新接口对应的头文件中找到说明文字


网上很多关于ffmpeg (libav)的资料都是N年以前的,而事实上ffmpeg数年来一直在“以时俱进”,因此无论是一些新手,或者号称为老手的人,有时候难免出头痛。。。。。。


为了解决大家的头痛的问题,特列一个贴子,把ffmpeg相关的一些常见的、版本的问题列举出来,供大家参考,同时也请大家一起补充。

1) 不认识guess_format.
解决:  #define guess_format  av_guess_format
接口不变。

2) 不认识av_alloc_format_context
解决:  #define   av_alloc_format_context  avformat_alloc_output_context
接口调整。

3) 不认识CODEC_TYPE_VIDEO 和 CODEC_TYPE_AUDIO
解决:
#define CODEC_TYPE_VIDEO AVMEDIA_TYPE_VIDEO
#define CODEC_TYPE_AUDIO AVMEDIA_TYPE_AUDIO

4) 不认识audio_resample_init
解决:#define audio_resample_init av_audio_resample_init
接口调整。

5) avcodec_decode_video 到 avcodec_decode_video2接口调整
旧代码:
  1. len = avcodec_decode_video(c, (short *)outbuf, &out_size, inbuf_ptr, size);
复制代码
新代码:
  1. av_init_packet(&pkt);
  2. pkt.data = (unsigned char*)inbuf_ptr;
  3. pkt.size = size;
  4. len = avcodec_decode_video2(c, &tmpFrame, &got_picture, &pkt);
复制代码

av_open_input_file
/opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:483: warning: 'int av_open_input_file(AVFormatContext**, const char*, AVInputFormat*, int, AVFormatParameters*)' is deprecated (declared at /opt/workspace/android/EasyPlayer/jni/EasyPlayer/../include/libavformat/avformat.h:1480)
新接口:
  1. #ifdef _FFMPEG_0_6__
  2.     if(av_open_input_file(&ffmpeg_fields.pFormatCtx, _filePath, NULL, 0, NULL) != 0)
  3. #else
  4.     if (avformat_open_input(&ffmpeg_fields.pFormatCtx, _filePath, NULL, NULL) != 0)
  5. #endif

复制代码
av_find_stream_info
/opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:494: warning: 'int av_find_stream_info(AVFormatContext*)' is deprecated (declared at /opt/workspace/android/EasyPlayer/jni/EasyPlayer/../include/libavformat/avformat.h:1526)
新接口:
  1. #ifdef _FFMPEG_0_6__
  2.         if(av_find_stream_info(ffmpeg_fields.pFormatCtx) < 0)
  3. #else
  4.         if (avformat_find_stream_info(ffmpeg_fields.pFormatCtx, NULL) < 0)
  5. #endif
复制代码
av_close_input_file

/opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:522: warning: 'void av_close_input_file(AVFormatContext*)' is deprecated (declared at /opt/workspace/android/EasyPlayer/jni/EasyPlayer/../include/libavformat/avformat.h:1706)

新接口:
  1. #ifdef _FFMPEG_0_6__
  2.         av_close_input_file(ffmpeg_fields.pFormatCtx);
  3. #else
  4.         avformat_close_input(&ffmpeg_fields.pFormatCtx);
  5. #endif

复制代码
注意,这个是个2级指针。

avcodec_open2
新出来的avcodec_open2接口支持一些编解码特性的指定。
#ifdef __FFMPEG_0_6__
    if (avcodec_open(ffmpeg_video.codec_ctx, ffmpeg_video.codec) < 0)
#else
    if (avcodec_open2(ffmpeg_video.codec_ctx, ffmpeg_video.codec, NULL) < 0)
#endif

avcodec_init

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:20: warning: 'void avcodec_init()' is deprecated (declared at /opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavcodec/avcodec.h:3932)

这个function已经不再需要了,当你调用avcodec_register()或者 avcodec_register_all()时,ffmpeg会自动调用它。所以放心大胆的移除掉就可以了。

url_fclose url_fopen url_fseek等等

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:67: warning: 'int url_fclose(AVIOContext*)' is deprecated (declared at /opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavformat/avio.h:324)
这一系统的接口都只需要在前面加一个avio_的前缀就可以了,如:avio_close()。

avcodec_alloc_context()

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:111: warning: 'AVCodecContext* avcodec_alloc_context()' is deprecated (declared at /opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavcodec/avcodec.h:4025)

使用最新接口:avcodec_alloc_context3()
  1.     m_pACodec = avcodec_find_encoder((CodecID)nCodecID);
  2.     if(!m_pACodec) return false;
  3.     m_pAContext                    = avcodec_alloc_context3(m_pACodec);


复制代码
av_get_bits_per_sample_format

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:143: warning: 'int av_get_bits_per_sample_format(AVSampleFormat)' is deprecated (declared at /opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavcodec/avcodec.h:4529)
新接口改为av_get_bytes_per_sample(反正音频bits per sample是8的倍数,不是8就是16,直接用byte比用bit更好)

audio_resample_init

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:157: error: 'audio_resample_init' was not declared in this scope
新接口:av_audio_resample_init,原先我以为ffmpeg要支持超过2 channels的resample,后来一看resample.c里的实现,结果发现还是只能支持mono和stereo
多出来的几个参数,给填default值:
  1.                 AV_SAMPLE_FMT_S16,
  2.                 AV_SAMPLE_FMT_S16,
  3.                 TAPS, 10, 0, 0.8

复制代码
详见resample.c,或者参考RTSPPlayer中的easyffmpeg.cpp.

PKT_FLAG_KEY
没什么好说的,直接在前面加个AV_的前缀:AV_PKT_FLAG_KEY

av_alloc_format_context

/opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:722: error: 'av_alloc_format_context' was not declared in this scope
这个前面两位同仁有提到不同,但不说怎么个不同法,实在可恨,我直接写个例子:
  1. avformat_alloc_output_context2(&m_pFormatCtx, pOutputFmt, "avi", pFileName);
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++界面开发_QT开发(三)——GUI原理分析

一、命令行程序命令行程序是面向过程的程序设计。命令行程序的特点&#xff1a;A、基于顺序结构执行B、程序执行过程中不需与用户交互C、程序执行结束给出最终运行结果命令行程序适用场合&#xff1a;A、单任务场合B、无交互、简单交互场合C、服务器应用场合二、GUI程序GUI程序…

[Ubuntu] Simple way to pass passwords on a shell script

here is the code for example: #!/bin/bashecho -e "your_password\nyour_password" | sudo /home/davidhhuan/the_shell_you_want_to_run.sh转载于:https://www.cnblogs.com/davidhhuan/archive/2012/11/12/2765983.html

解决链接错误:error LNK2001: 无法解析的外部符号 __iob

该错误主要是由于静态库在VC6编译而主程序在VC2005编译&#xff0c;大家用的CRT不同。解决办法&#xff0c;代码中增加 #ifdef __cplusplus extern "C" #endif FILE _iob[3] {__iob_func()[0], __iob_func()[1], __iob_func()[2]}; 此错误的产生根源&#xff1a; 在…

pycharm使用_后端开发使用pycharm的技巧

1、使用说明首先说明&#xff0c;本文所使用的功能为pycharm专业版所支持&#xff0c;其他版本如社区版&#xff0c;教育版&#xff0c;则不一定支持。作为一名后端开发&#xff0c;我猜你的桌面上一定打开着一系列的软件&#xff0c;用作开发调试工具&#xff0c;比如navicat数…

关于javafx支持IOS、android等智能手机解决方案

这两天回到javafx社区逛了一下&#xff0c;发现对这个问题讨论很多... 看完后&#xff0c;有两种意见。 第一种&#xff1a;是主流的&#xff0c;包括javafx社区以及绝大部分oracle内部javafx开发人员的意见&#xff1a;应该要支持&#xff0c;而且想把这个事情加入roadmap&…

java视窗_java-预览窗口(如Windows 7任务栏显示已打开的...

一个极其简单的实现.import java.awt.*;import java.awt.image.*;import java.awt.event.*;import javax.swing.*;class ShowPreviews {class ToolTipListener extends MouseAdapter {JWindow toolTip;JLabel label;Component preview;ToolTipListener(Component preview) {thi…

linux(ubuntu)下分区和格式化sd卡

我的手机sd卡需要分成两个分区&#xff0c;在windowxp下面死活搞不成。主要的问题是&#xff0c;window只认识sd卡的第一个分区。有人用修改驱动程序&#xff0c;让windows把sd卡认成日立的microdisk&#xff0c;分区和格式化也可以完成。但是在我的笔记本上&#xff0c;sd读卡…

@value 静态变量_Java中的变量——通过示例学习Java编程(4)

作者&#xff1a;CHAITANYA SINGH来源&#xff1a;通过示例学习Java编程&#xff08;4&#xff09;&#xff1a;Java中的变量-方家话题​www.koofun.com变量是用来存放可以更改的值的容器。例如&#xff0c;当我写int i 10; 这里变量名是i&#xff0c;它与值10相关联&#xff…

nmf算法 python_NMF算法简介及python实现

[ pca算法用于原始数据维数较高时对数据进行降维 关于pca算法的学习&#xff0c;有一篇分析特别详细的论文http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_componen基本原理NMF&#xff0c;非负矩阵分解&#xff0c;它的目标很明确&#xff0c;就是将大矩阵分…

linux 修改消息队列大小

环境&#xff1a;red hat5 linux消息队列的配置文件为&#xff1a; /etc/sysctl.conf ,里面&#xff1a; msgmax:  一条最大消息的字节数 msgmnb&#xff1a; 一个消息队列总共最大字节数 而我的系统这2个值都默认是65536&#xff0c;假如发一条65536长度的消息&#xff0c;…

龙芯购买MIPS指令集的授权

以前指责龙芯购买MIPS授权的那篇文章让人啼笑皆非&#xff0c;只能用无知来概况我在IT从业多年&#xff0c;非常赞同龙芯购买MIPS指令集的授权&#xff01;分几个方面来阐述&#xff1a;&#xff08;1&#xff09;什么是指令集&#xff1f;指令集好像英文的26个字母&#xff0c…

python网络爬虫_Python爬虫实战之网络小说

今天和大家分享的是python爬虫实战&#xff0c;由于本人最近迷上了看网络小说&#xff0c;学生党又穷&#xff0c;只能看看网络dao版小说&#xff0c;现在这类dao版小说网站可以说非常的多&#xff0c;但是所有的网站进去都可以看见一大把的广告信息&#xff0c;非常影响我们的…

java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...

今天&#xff0c;下午在和朋友聊天的时候&#xff0c;聊起了反射这个话题。我们就从下面这个段简单的代码开始吧。这个代码输出什么&#xff0c;想必大部分的读者跟我一样&#xff0c;会很快地知道答案&#xff1a;0 1 2 3 4 5 6 7 8 9。事实也是如此&#xff1a;朋友这个时候就…

实时修改和读取webconfig

ConfigurationManager.AppSettings.Set("MailUser","3" );ConfigurationManager.AppSettings.Set("MailPassword","2");ConfigurationManager.AppSettings.Set("MailEnable","1" ); 只能临时保存实时修改webconfi…

activity 点击后传递数据给fragment_Fragment 新特性 : Fragment Result API 使用以及源码分析

原标题: Android Fragments: Fragment Result原文地址: https://proandroiddev.com/android-fragments-fragment-result......原文作者: Husayn Hakeem今年 Google 推出了 Fragment Result API 和 Activity Results API&#xff0c;用来取代之前的 Activity 和 Fragment 之间通…

linux动态库与静态库混合连接

在应用程序需要连接外部库的情况下&#xff0c;linux默认对库的连接是使用动态库&#xff0c;在找不到动态库的情况下再选择静态库。使用方式为&#xff1a; gcc test.cpp -L. -ltestlib 如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定…

java运算函数_Java中的数学计算函数

Math类&#xff1a;java.lang.Math类中包含基本的数字操作&#xff0c;如指数、对数、平方根和三角函数。java.math是一个包&#xff0c;提供用于执行任意精度整数(BigInteger)算法和任意精度小数(BigDecimal)算法的类。java.lang.Math类中包含E和PI两个静态常量&#xff0c;以…

从无头单链表中删除节点

#include<iostream> using namespace std;struct Node{int data;Node* next; };void deleteNode(Node* p) {p->datap->next->data; //将p后的节点的数值赋给p的data域p->nextp->next->next; //将p后的节点删除&#xff0c;即完成了删除节点p的效果…

android卡片层叠效果_ReactNative之Android绝对布局position:#x27;absolute#x27;问题

工作中会遇到各种各样的问题&#xff0c;ReactNative开发也是填坑不止。比如最近在开发需求中&#xff0c;就遇到一个问题。在一个卡片类型的右上角添加一个删除按钮。使用了绝对布局position:absolute属性&#xff0c;在Android上却无法正常显示&#xff0c;很是烦恼。有一个相…

java监听机制_详解java的事件监听机制和观察者设计模式

首先说说监听器&#xff1a;监听器就是一个实现特定接口的普通java程序&#xff0c;这个程序专门用于监听另一个java对象的方法调用或属性改变&#xff0c;当被监听对象发生上述事件后&#xff0c;监听器某个方法将立即被执 行。java的事件监听机制可概括为3点&#xff1a;1,ja…