FFmpeg(2)-avformat_open_input()函数详解并示例打开mp4文件

时间:2022-09-09 18:44:44

一. 解封装

pts 是显示的时间 dts是解码的时间, 这个时间是用来做同步。

  1. av_register_all(), 注册所有的格式。包括解封装格式和加封装格式。
  2. avformat_network_init(), 用于初始化网络。FFmpeg本身也支持解封装RTSP的数据,如果要解封装网络数据格式,则可调用该函数。
  3. avformat_open_input()。打开一个文件并解析。可解析的内容包括:视频流、音频流、视频流参数、音频流参数、视频帧索引。
  4. avformat_find_stream_info(),查找格式和索引。有些早期格式它的索引并没有放到头当中,需要你到后面探测,就会用到此函数。
  5. av_find_best_stream(), 当视频被解封装出来后,需要分开处理音频和视频,需要找到对应的音频流和视频流
  6. 解封装后涉及到的结构体:

AVFormatContext: 封装的上下文

AVStream : 存放的是音频流或视频流的参数信息

AVPacket: 针对于具体的解封装完后的一个一个的数据包。

av_read_frame() 用于读取一个AVPacket,AVPacket里面包含了这个包的pts,dts,还有这个包的stream index(它是音频还是视频),是否是关键帧,AVPacket把h264数据的间隔符去掉了。

二.avformat_open_input()函数详解及mp4文件打开示例

2.1 avformat_open_input函数详解

该函数用于打开一个输入的封装器。在调用该函数之前,须确保av_register_all()和avformat_network_init()已调用。

参数说明:

AVFormatContext **ps, 格式化的上下文。要注意,如果传入的是一个AVFormatContext*的指针,则该空间须自己手动清理,若传入的指针为空,则FFmpeg会内部自己创建。

const char *url, 传入的地址。支持http,RTSP,以及普通的本地文件。地址最终会存入到AVFormatContext结构体当中。

AVInputFormat *fmt, 指定输入的封装格式。一般传NULL,由FFmpeg自行探测。

AVDictionary **options, 其它参数设置。它是一个字典,用于参数传递,不传则写NULL。参见:libavformat/options_table.h,其中包含了它支持的参数设置。

2.2 mp4文件打开示例

extern "C" JNIEXPORT jstring
JNICALL
Java_com_yuneec_yongdaimi_ff_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
hello += avcodec_configuration(); // 初始化解封装
av_register_all();
// 初始化网络
avformat_network_init();
// 打开文件
AVFormatContext *ic = NULL;
char path[] = "sdcard/1080.mp4";
int ret = avformat_open_input(&ic, path, , );
if (ret == ) {
LOGI("avformat_open_input() called success.");
} else {
LOGE("avformat_open_input() called failed: %s", av_err2str(ret));
}
return env->NewStringUTF(hello.c_str());
}

PS:

1.这里用到了avformat_open_input()函数,需要包含其对应的头文件: #include <libavformat/avformat.h> ;

2.代码中还用到了 av_err2str() 这个函数,因此CMakeLists.txt中还需要包含它所对应的 libavutil.so 库,相关的CMakeLists.txt如下:

# avcodec
add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/libavcodec.so) # avformat
add_library(avformat SHARED IMPORTED)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/libavformat.so) # avutil
add_library(avutil SHARED IMPORTED)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/libavutil.so)

另外,不要忘记添加链接:

target_link_libraries( # Specifies the target library.
native-lib
avcodec
avformat
avutil # Links the target library to the log library
# included in the NDK.
${log-lib} )

FFmpeg(2)-avformat_open_input()函数详解并示例打开mp4文件的更多相关文章

  1. php pack&lpar;&rpar;函数详解与示例

    pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了.他的excel的头就是pack出来的最近在尝试与C交互的时候又用上了这玩意,所以不得不再 ...

  2. CreateProcess函数详解及示例

    WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件. 函数原型: BOOL CreateProcess ( LPCTSTR lpApplic ...

  3. Wordpress菜单函数wp&lowbar;nav&lowbar;menu各参数详解及示例

    Wordpress菜单函数wp_nav_menu各参数详解及示例   注册菜单 首先要注册菜单,将以下函数添加至function.php函数里   register_nav_menus(array( ...

  4. ffmpeg播放器实现详解 - 视频显示

    ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...

  5. javascript 函数详解2 -- arguments

    今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...

  6. ThinkPHP函数详解:session方法

    ThinkPHP函数详解:session方法 Session方法用于Session 设置.获取.删除和管理操作. Session 用于Session 设置.获取.删除和管理操作 用法    sessi ...

  7. 【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

  8. C&plus;&plus; 虚函数详解

    C++ 虚函数详解 这篇文章主要是转载的http://blog.csdn.net/haoel/article/details/1948051这篇文章,其中又加入了自己的理解和难点以及疑问的解决过程,对 ...

  9. Python内置函数详解

    置顶   内置函数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii https://docs.pyth ...

随机推荐

  1. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  2. SilverLight 控件ListBox中的SelectionChanged事件

    出现的问题: ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现 ...

  3. 微信小程序视频地址

    微信小程序视频系列教程完整版,课程中用到的源码附在帖子最后. [url=http://bbs.larkapp.com/forum.php?mod=viewthread&tid=5673][b] ...

  4. datazen 修改instanceid db&lowbar;encryption&lowbar;key

    切换到Datazen.Enterprise.Server.3.0.3327.exe 所在的目录 运行如下命令: Datazen.Enterprise.Server.3.0.3327.exe DATAZ ...

  5. C&num; 弗洛伊德&lpar;Floyd&rpar;算法

    弗洛伊德(Floyd)算法 主要是用于计算图中所有顶点对之间的最短距离长度的算法,如果是要求某一个特定点到图中所有顶点之间的最短距离可以用;        ;    ;    ;            ...

  6. 一些Windows API导致的Crash以及使用问题总结

    RegQueryValueEx gethostbyname/getaddrinfo _localtime64 FindFirstFile/FindNextFile VerQueryValue Crea ...

  7. 程序员要拥抱变化,聊聊Android即将支持的Java 8

    WeTest 导读 Java 9预计今年也会正式发布,Java 8这个最具变革性且变革性最适于GUI程序的版本,Android终于准备正式支持.从自己开发JavaFx的感受,说一说Java 8应该使用 ...

  8. Python 学习&lpar;1&rpar; 简单的小爬虫

    最近抽空学了两天的Python,基础知识都看完了,正好想申请个联通日租卡,就花了2小时写了个小爬虫,爬一下联通日租卡的申请页面,看有没有好记一点的手机号~   人工挑眼都挑花了. 用的IDE是PyCh ...

  9. JAVA中static的作用

    static表示"全局"."静态"的意思,用来修饰成员变量和成员方法,不过在JAVA中没有全局的意思. 1. 被static修饰的成员变量和成员方法独立于该类的 ...

  10. &lbrack;Oracle&rsqb;为何Archivelog 没有马上被删除

    [Oracle]为何Archivelog 没有马上被删除 客户设置了 Archivelog 的 deletion policy 是 CONFIGURE ARCHIVELOG DELETION POLI ...