热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg结构和编解码流程

ffmpeg结构以及作用:AVUtil:核心工具库AVFormat:提供了音视频容器格式的封装和解析以及所支持的协议文件格式和协议库AVCodec:编

ffmpeg 结构以及作用:


  • AVUtil: 核心工具库
  • AVFormat:提供了音视频容器格式的封装和解析以及所支持的协议文件格式和协议库
  • AVCodec: 编解码库
  • AVFilter: 音视频滤镜库 如视频加水印、音频变声
  • AVDevice: 输入输出设备库,提供设备数据的输入与输出,如读取摄像头数据、屏幕录制
  • SwrRessample: 音频重采样
  • SWScale: 图像格式转换的模块,yuv -> rgb
  • PostProc:后期处理

解码流程:


  1. av_register_all:
    先调用avcodec_register_all来注册所有config.h里面开放的编解码器,然后会注册所有的Muxer和Demuxer(也就是封装格式),最后注册所有的Protocol(即协议层的东西)

  2. avformat_alloc_context:
    分配初始化一个AVFormatContext结构体

  3. avformat_open_input:
    解码时,根据文件路径判断文件格式,决定使用哪个Demuxer,构建好AVStream

  4. avformat_find_stream_info:
    解码时,作用是从文件中提取流信,将所有的Stream的MetaData信息填充好,先read_packet一段数据解码分析流数据

  5. 穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO

  6. avcodec_find_decoder:
    作用是找解码器,avcodec_resgister_all已经将解码器和编码器放到一个链表中,根据codec Id和name循环遍历找出

  7. avcodec_open2:
    avcodec_open2(AVCodecContext, Codec, NULL)
    作用是打开编码器或解码器

  8. avcodec_alloc_frame:
    为解码帧分配内存

  9. 不停地从码流中提取出帧数据 av_read_frame:
    解码时,读取出AVPacket,对应音频流,一个AVPacket可能包含多个AVFrame,对应视频流,一个AVPacket对应一个AVFrame

  10. 判断帧的类型,对于视频帧调用: avcodec_decode_video:

  11. avcodec_close:
    释放解码器

  12. av_close_input_file:
    关闭输入文件


编码流程

编码流程


  1. avformat_alloc_output_context2:
    初始化输出码流的 AVFormatContext

  2. avio_open:
    打开输出文件

  3. av_new_stream:
    创建输出码流的 AVStream

  4. avcodec_find_encoder:
    查找编码器。

  5. avcodec_open2:
    打开编码器

  6. avformat_write_header:
    写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS)

  7. avcodec_encode_video2:
    编码一帧视频。即将 AVFrame(存储 YUV 像素数据)编码为 AVPacket(存储 H.264 等格式的码流数据)

  8. av_write_frame:
    将编码后的视频码流写入文件。

  9. flush_encoder:
    输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的 AVPacket。

  10. av_write_trailer:
    写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS)。

  11. 释放资源


记录下主要模块


  • AVFormatContext:
    libavformat - 提供了更加全面的音视频容器格式的封装和解析以及所支持的协议
    AVFormatContext

  • AVCodec
    libavcodec - 提供了更加全面的编解码实现的合集
    AVCodec

AVPacket: 存储压缩数据,视频对应的H264数据流、音频对应的AAC/MP3数据流
AVFrame:存储原始数据,视频对应的RGB/YUV像素数据,音频对应的PCM数据

AVStream包含AVCodecContext,描述编码格式codec_type,根据格式打开编码器解码器进行AVPacket和AVFrame之间解码和编码


参考链接:

《音视频开发进阶指南》
https://blog.csdn.net/leixiaohua1020/article/details/14214577
https://blog.csdn.net/zhaodebbs/article/details/65628801
https://www.jianshu.com/p/ceaa286d8aff


推荐阅读
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 《Spring in Action 第4版:全面解析与实战指南》
    《Spring in Action 第4版:全面解析与实战指南》不仅详细介绍了Spring框架的核心优势,如简洁易测试、低耦合特性,还深入探讨了其轻量级和最小侵入性的设计原则。书中强调了声明式编程的优势,并通过基于约定的方法简化开发流程。此外,Spring的模板机制有效减少了重复代码,而依赖注入功能则由容器自动管理,确保了应用的灵活性和可维护性。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
author-avatar
yoyokk99的秋天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有