快手 · 音视频技术入门课
刘歧
快手音视频首席架构师
4513 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 18 讲
快手 · 音视频技术入门课
15
15
1.0x
00:00/00:00
登录|注册

10 | FFmpeg 基础模块(一):容器相关的 API 操作

你好,我是刘歧。
学到这里,相信你对音视频的基本工作原理和基本操作已经有了一定的认识,并且能够通过命令行、参考标准文档等工具独立完成一些音视频工作了。课程到现在开始渐入佳境,我们要从工具用户逐渐转变成 API 用户了。毕竟还有很多工作是 FFmpeg 命令行操作起来不太方便的,比如直播连麦的动态画面拼接、连麦 PK 结束后画面比例变化等。
从这节课开始,我们会逐步分析作为 API 用户我们需要了解的 FFmpeg 中的重要模块,比如 AVFormat 模块、AVcodec 模块、AVfilter 模块、swscale 模块、swresample 模块。
在具体讲解如何使用 FFmpeg 的 API 之前,为了方便你查看 API 对应的代码,首先我会介绍一下 FFmpeg 的代码结构目录,我建议你先从FFmpeg 的官方代码库下载一份代码。
git clone git://source.ffmpeg.org/ffmpeg.git
从目录中可以看到,FFmpeg 目录中包含了 FFmpeg 库代码目录、构建工程目录、自测子系统目录等,具体内容如下:
现在你知道 FFmpeg 的源代码目录中都包含了哪些内容,在之后使用 FFmpeg 的 API 做开发遇到问题时,就可以通过查看源代码来了解更多、更详细的内部实现了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

FFmpeg基础模块(一):容器相关的API操作介绍了作为API用户需要了解的FFmpeg中的重要模块AVFormat模块。文章首先介绍了FFmpeg的代码结构目录,然后详细讲解了AVFormat模块的前处理部分和读写处理部分的常用接口及其作用。在前处理部分,涉及网络初始化、模块遍历、申请上下文空间、打开文件以及分析音视频流等操作;而在读写处理部分,包括从AVFormatContext中读取AVPacket、拖动进度条时的seek操作、清空当前AVFormatContext中的buffer、写入封装格式头部和收尾部等操作。总结指出了了解这些接口的用途和可能出现的问题及解决办法,可以让读者在实践中更好地使用它们去做容器封装和解封装方面的操作。最后,提出了一个思考题,引导读者思考在使用API时如何传递特定参数。整体而言,本文内容详实,适合需要深入了解FFmpeg基础模块的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 音视频技术入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:FFmpeg框架有渲染音频的能力吗?比如要实现“混音”功能,即在一个音频上叠加另外一个音频,混音后能同时听到两个声音。Ffmpeg是否支持开发“混音”功能?(安卓系统上搜到了几个音频编辑的APP,APP的其中一个功能是“音频合并”。我这里说的“混音”差不多就是“音频合并”)。 Q2:切片是什么意思?是若干帧的组合吗?或者是从视频或音频文件中截取一小段? Q3:partition、切片、宏块有什么区别? Q4:”side data”是什么意思?

    作者回复: 1. amix滤镜可以搞定 2. 视频文件切片,编码的话通常叫切slice或者tile 3. 可以参考极客时间的搞定视频课 4. 通常指avpacket里面的side data,用于存放编解码数据以外的信息相关的数据,例如旋转信息,例如目标识别相关信息一类的数据

    2022-08-16归属地:北京
    3
  • Geek_a54b66
    windows 的 ffmpeg 要通过源代码编译,还是官网直接下编译好的,如果要编译怎么编译,而且开发环境怎么搭建

    作者回复: github有个叫btbn的user,他有一个编译ffmpeg的脚本的repo,很值得研究

    2023-05-12归属地:江苏
    1
  • ifelse
    学习打卡
    2023-12-28归属地:浙江
  • Sky丶蓝调
    在FFmpeg的API中,可以使用av_opt_set()函数来设置movflags参数,从而实现将MP4的moov移动到文件头部的功能。具体步骤如下: 首先需要获取AVFormatContext,可以使用avformat_alloc_output_context2()函数创建一个输出上下文。 设置输出格式和输出文件路径,可以使用avformat_new_stream()函数新建一个流。 使用av_opt_set()函数设置movflags参数,将其设置为"faststart"。 调用avformat_write_header()函数写入文件头。 循环调用av_interleaved_write_frame()函数将AVPacket输出到文件中。 调用av_write_trailer()函数输出文件尾。 需要注意的是,如果使用avformat_write_header()函数写入文件头之前没有设置movflags参数,那么moov将会被放在文件的尾部。如果在调用avformat_write_header()函数之后再设置movflags参数,那么设置将不起作用。因此,必须在调用avformat_write_header()函数之前设置movflags参数。 AVFormatContext *out_ctx; AVOutputFormat *out_fmt; AVStream *out_stream; AVCodecContext *codec_ctx; AVCodec *codec; AVPacket packet; avformat_alloc_output_context2(&out_ctx, NULL, "mp4", "output.mp4"); out_fmt = out_ctx->oformat; out_stream = avformat_new_stream(out_ctx, NULL); codec_ctx = out_stream->codec; codec = avcodec_find_encoder(codec_ctx->codec_id); avcodec_open2(codec_ctx, codec, NULL); av_opt_set(out_ctx->priv_data, "movflags", "faststart", 0); avformat_write_header(out_ctx, NULL); while (/* 读取AVPacket */) { av_interleaved_write_frame(out_ctx, &packet); } av_write_trailer(out_ctx);
    2023-04-01归属地:广东
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部