前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用FFmpeg库和API的介绍

使用FFmpeg库和API的介绍

作者头像
用户1324186
发布2020-02-13 11:33:43
3K0
发布2020-02-13 11:33:43
举报
文章被收录于专栏:媒矿工厂媒矿工厂

本文是来自SF Video Technology 2019年8月的演讲,演讲者是Matt Szatmary,演讲题目是"An Introduction to Building tools with FFmpeg libraries and APIs",关于FFmpeg库和API的使用

目前很多人使用FFmpeg的命令行接口,使用一大串的指令去指示FFmpeg完成一些视频处理工作,这本身没什么问题。但FFmpeg是本身是libav库的顶层接口这个库有大量的工具,包括libavformat, libavcodec,libavfilter等,各自具有不同的功能。FFmpeg中有大量的字符串处理代码,将用户输入的指令转化为具体的代码,从而能够调用上述各个libav库。但是演讲者认为使用FFmpeg命令行并不能传递足够充分的信息,直接调用libav库的代码更加灵活和便于精细地控制。

于是一个显然的解决方法就是使用这些库来构建自己的工具,并且给现有的FFmpeg社区提一些patch。如果从事的工作对这个社区有利,就应该将自己写的patch贡献给社区,但这不总是可行的,因为以下一些原因:不应改变FFmpeg的默认设置、提patch并且维护需要花费精力、patch可能不适用其他人、保密方面和公司商业机密方面的原因等。

因此大部分人的做法是下载FFmpeg后,打上自己的patch。这样做的问题是难以升级,因为FFmpeg一直在更新,所以升级时会产生合并的冲突问题。所以很多公司就会一直使用一个老版本的FFmpeg,这可能会导致安全问题,因为FFmpeg常常会更新一些安全方面的patch。

接下来演讲者介绍了一些链接,里面有一些关于如何使用libav的API的一些教程,需要注意的是这些链接比较陈旧,但依旧具有参考价值。这些链接如下:

https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples

https://github.com/leandromoreira/ffmpeg-libav-tutorial

http://dranger.com/ffmpeg/

接下来演讲者展示了一条工作流的具体代码,工作流的步骤包括打开文件、分析文件、配置解码器、从文件中读取帧、将帧送给解码器、从解码器中读取结果以及最后的清理工作

1. 打开和分析输入文件的核心函数包括avformat_open_input()打开输入文件,avformat_find_stream_info()获取流信息和avformat_close_input()关闭输入文件。演讲者在这一部分代码中使用了一些C++11的新特性,用于自动清理和释放内存。

2. 配置编码器的核心函数包括av_find_best_stream()获取流索引,avcodec_alloc_context3()给解码器分配内存(此函数不进行初始化),avcodec_parameters_to_context()把从流中获得的解码器参数放入刚刚创建的解码器中,avcodec_open2()打开解码器和avcodec_free_context()释放解码器内存。

3. 在读取帧,送入解码器及获取结果的这一个循环中,演讲者展示了for循环便于使用的新特性。这一环节的核心函数包括av_read_frame()读取帧,av_paket_rescale_ts()改变时间基准,avcodec_send_packet()将packet送入解码器,av_fame_alloc()给帧分配空间, avcodec_receive_frame()从解码器获得帧,以及部分用于设置显示格式的代码。

4. 下一步是将文件读取完毕时解码器中的剩余帧也取出来显示,这部分与上一步类似,只是不再给解码器送入新的packet。

5. 最后的清理工作将由前面设置的各个释放内存的函数自动完成,也就是前述用于内存释放的C++11新特性。

以上是解码的工作流。在这个工作流中,我们可以获得视频流中的所有数据,并进行想要的修改,演讲者举了几个滤镜的例子来说明这一点。如果我们使用这些libav库的api来构建系统,而不是使用ffmpeg的命令行,将可以做到更多的事,不必受限于命令行那些有限的指令;同时,当ffmpeg更新时,系统也将不需要进行大的修改,因为libav库的api比较稳定,改动不会很多。

下面是QA环节,问题分别是:

1. 这些库有没有C API?

2. 编码器是否会自动检测有哪些计算资源(会不会自动使用GPU)?

3. 相比于修改FFmpeg,你从使用libav的API中获得了什么?

演讲者一一进行了回答,这些问题和回答也值得一看。

附上演讲视频:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 媒矿工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
媒体处理
媒体处理(Media Processing Service,MPS)是一种云端音视频处理服务。基于腾讯多年音视频领域的深耕,为您提供极致的编码能力,大幅节约存储及带宽成本、实现全平台播放,同时提供视频截图、音视频增强、内容理解、内容审核等能力,满足您在各种场景下对视频的处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档