音视频开发9 FFmpeg 解复用框架说明,重要知识点
一,播放器框架

二 常用音视频术语
三 常用概念-复用器

四 常用概念-编解码器
五 FFmpeg库简介

六 FFmpeg函数简介
◼ av_register_all():注册所有组件,4.0已经弃用
◼ avdevice_register_all()对设备进行注册,比如V4L2等。
#include <libavdevice/avdevice.h>/*** Initialize libavdevice and register all the input and output devices.*/
void avdevice_register_all(void); ◼ avformat_network_init();初始化网络库以及网络加密协议相关 的库(比如openssl)
#include <libavformat/avformat.h>int avformat_network_init(void); 七 FFmpeg函数简介-封装格式相关
◼ avformat_alloc_context();负责申请一个AVFormatContext 结构的内存,并进行简单初始化
#include <libavformat/avformat.h>/*** Allocate an AVFormatContext.* avformat_free_context() can be used to free the context and everything* allocated by the framework within it.*/
AVFormatContext *avformat_alloc_context(void);## AVFormatContext:它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体, 其中比较重要的几个如下解释:
typedef struct AVFormatContext {const AVClass *av_class; // 一个类,用于保存指向父对象的链接,用于日志记录struct AVInputFormat *iformat; // 用于指定输入文件的格式以及文件读取的操作函数struct AVOutputFormat *oformat; // 用于指定输出文件的格式以及文件写入的操作函数void *priv_data; // 指向 AVFormatContext(容器上下文)的私有数据AVIOContext *pb; // 用于读取和写入媒体数据的 I/O 上下文int nb_streams; // 流的数量,包括音频、视频、字幕等AVStream **streams; // 指向 AVStream 结构体的指针,用于存储所有流的信息char *filename; // 用于存储文件名的字符串int64_t start_time, duration;// 媒体文件的起始时间戳和持续时间int64_t bit_rate; // 比特率,以 bit/s 计算uint8_t *buffer; // 用于暂存数据的缓冲区int buffer_size; // 缓冲区的大小
} AVFormatContext;AVFormatContext 结构体的各个成员变量的作用详见以下介绍。成员变量介绍AVClass *av_class: 一个类,用于保存指向父对象的链接,用于日志记录;
AVClass是FFmpeg中libavutil库中的一个结构体,用于在FFmpeg中实现类及其对象的日志和调试功能。AVClass提供了一种标准的方式来管理类及其对象,在不同的库和插件之间提供了统一的日志记录和调试接口。AVInputFormat *iformat:用于指定输入文件的格式以及文件读取的操作函数;
AVOutputFormat *oformat: 用于指定输出文件的格式以及文件写入的操作函数;void *priv_data: 指向 AVFormatContext(容器上下文)的私有数据;
priv_data成员可以用于存储和传递特定协议下使用的私有数据,常见的使用场景是实现自定义输入或输出协议。AVIOContext *pb:用于读取和写入媒体数据的 I/O 上下文;
AVIOContext 是libavformat库中一个表示访问媒体文件的I/O环境的结构体。它封装了对媒体文件的读取和写入操作,提供了和具体I/O操作系统相关的操作的抽象接口,实现了独立于实际操作系统的媒体文件访问接口。int nb_streams: 流的数量,包括音频、视频、字幕等;
AVStream **streams:指向 AVStream 结构体的指针,用于存储所有流的信息;
AVStream是FFmpeg中libavformat库中的一个数据结构,用于表示媒体文件中的一个音频或视频流。在FFmpeg中,一个媒体文件通常包含多个音视频流,每个流对应着媒体文件中的一个轨道。AVStream通过存储音视频流的各种属性信息,方便解码和编码,对于多媒体处理和视频编辑有着至关重要的作用。
AVStream包含了一个媒体流的所有基本信息,如类型、编解码器、时间戳、时长、帧率、码率等等。常用的成员变量有:
char *filename: 用于存储文件名的字符串;int64_t start_time: 媒体文件的起始时间戳;
int64_t duration: 媒体文件的持续时间;
int64_t bit_rate: 比特率,以 bit/s 计算;
uint8_t *buffer: 用于暂存数据的缓冲区;
int buffer_size: 缓冲区的大小。 ◼ avformat_free_context();释放该结构里的所有东西以及该 结构本身
#include <libavformat/avformat.h>/*** Free an AVFormatContext and all its streams.* @param s context to free*/
void avformat_free_context(AVFormatContext *s); ◼ avformat_open_input();打开输入视频文件
/*** Open an input stream and read the header. The codecs are not opened.* The stream must be closed with avformat_close_input().** @param ps Pointer to user-supplied AVFormatContext (allocated by* avformat_alloc_context). May be a pointer to NULL, in* which case an AVFormatContext is allocated by this* function and written into ps.* Note that a user-supplied AVFormatContext will be freed* on failure.* @param url URL of the stream to open.* @param fmt If non-NULL, this parameter forces a specific input format.* Otherwise the format is autodetected.* @param options A dictionary filled with AVFormatContext and demuxer-private* options.* On return this parameter will be destroyed and replaced with* a dict containing options that were not found. May be NULL.** @return 0 on success, a negative AVERROR on failure.** @note If you want to use custom IO, preallocate the format context and set its pb field.*/
int avformat_open_input(AVFormatContext **ps, const char *url,const AVInputFormat *fmt, AVDictionary **options);
八 FFmpeg解码函数简介-解码器相关

相关文章:
音视频开发9 FFmpeg 解复用框架说明,重要知识点
一,播放器框架 二 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件, 比如mp4、flv、mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据࿰…...
抖音小店出单之后怎么发货?抖店详细发货流程来了
大家好,我是喷火龙。 抖音小店发货是有规则的,如果出现超时发货或者虚假发货都会被平台处罚的,会影响我们店铺的评分和正常运营,还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…...
Transformer详解(5)-编码器和解码器
1、Transformer编码器 import torch from torch import nn import copy from norm import Norm from multi_head_attention import MultiHeadAttention from feed_forward import FeedForward from pos_encoder import PositionalEncoderdef get_clones(module, N):"&quo…...
线程安全-3 JMM
一.谈一下JMM 1.JMM,JavaMemoryModel,Java内存模型。定义了多线程对共享内存读写操作的行为规范,通过规范多线程对共享内存的读写操作,以保证指令执行和结果的正确性。 2.JMM把内存分为两块 (1)主内存&a…...
4 CSS的 变换、过渡与动画
CSS3引入了变换、过渡和动画特性,使得网页可以呈现出丰富的视觉效果和交互体验。通过这些新特性,开发者可以创建复杂的动画效果,而不需要使用JavaScript。 4.1 变换(Transforms) 变换允许开发者对元素进行旋转、缩放…...
前端基础入门三大核心之JS篇:掌握数字魔法 ——「累加器与累乘器」的奥秘籍【含样例代码】
前端基础入门三大核心之JS篇:掌握数字魔法 ——「累加器与累乘器」的奥秘籍 🧙♂️ 基础概念:数字的魔杖与炼金术累加器(Accumulator)累乘器(Multiplier) 📚 实战演练:…...
git clone 出现的问题
问题: core源码ref新API % git clone https://github.com/xxxx.git Cloning into core... remote: Enumerating objects: 58033, done. remote: Counting objects: 100% (1393/1393), done. remote: Compressing objects: 100% (750/750), done. error: 432 bytes of body are …...
Vue2和Vue3生命周期的对比
Vue2和Vue3生命周期的对比 Vue2 和 Vue3 生命周期对照表Vue2 和 Vue3 生命周期图示 Vue2 和 Vue3 生命周期对照表 触发时机Vue2.xVue3.x组件创建时运行beforeCreate setup createdsetup 挂载在DOM时运行beforeMountonBeforeMountmountedonMounted响应数据修改时运行beforeUpdat…...
全面解析Java.lang.ClassCastException异常
全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常:解决方案与最佳实践 🚀📚摘要引言1. 什么是Java.lang.ClassCastException?代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…...
美团Java社招面试题真题,最新面试题
如何处理Java中的内存泄露? 1、识别泄露: 使用内存分析工具(如Eclipse Memory Analyzer Tool、VisualVM)来识别内存泄露的源头。 2、代码审查: 定期进行代码审查,关注静态集合类属性和监听器注册等常见内…...
二十八、openlayers官网示例Data Tiles解析——自定义绘制DataTile源数据
官网demo地址: https://openlayers.org/en/latest/examples/data-tiles.html 这篇示例讲解的是自定义加载DataTile源格式的数据。 先来看一下什么是DataTile,这个源是一个数组,与我们之前XYZ切片源有所不同。DataTile主要适用于需要动态生成…...
分布式事务解决方案(最终一致性【TCC解决方案】)
最终一致性分布式事务概述 强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保持一致,查询任意节点的数据都能得到最新的数据结果,这就导致在分布式场景,尤其是高并发场景下,系统的性能受到了影响。而最终一致性分布式…...
App Inventor 2 Encrypt.Security 安全性扩展:MD5哈希,SHA/AES/RSA/BASE64
这是关于App Inventor和Thunkable安全性的扩展,它提供MD5哈希,SHA1和SHA256哈希,AES加密/解密,RSA加密/解密,BASE64编码/解码方法。 权限 此扩展程序不需要任何权限。 事件 OnErrorOccured 抛出任何异常时将触发此事件…...
深入了解Linux中的环境变量
在Linux系统中,环境变量(Environment Variables)是用于配置操作系统和应用程序运行环境的一种机制。它们储存在键值对中,可以控制程序的行为、路径查找和系统配置。本文将深入探讨环境变量的基本概念、常见类型、设置和管理方法&a…...
雷军-2022.8小米创业思考-8-和用户交朋友,非粉丝经济;性价比是最大的诚意;新媒体,直播离用户更近;用真诚打动朋友,脸皮厚点!
第八章 和用户交朋友 2005年,为了进一步推动金山的互联网转型,让金山的同事更好地理解互联网的精髓,我推动了一场向谷歌学习的运动,其中一个小要求就是要能背诵“谷歌十诫”。 十诫的第一条就令人印象深刻:以用户为中…...
【Vue2.x】props技术详解
1.什么是prop? 定义:组件标签上注册的一些自定义属性作用:向子组件传递数据特点 可以传递任意数量的prop可以传递任意类型的prop 2.prop校验 为了避免乱传数据,需要进行校验 完整写法 将之前props数组的写法,改为对象…...
C语言例题46、根据公式π/4=1-1/3+1/5-1/7+1/9-1/11+…,计算π的近似值,当最后一项的绝对值小于0.000001为止
#include <stdio.h> #include <math.h>int main() {int fm 1;//分母double sign 1;//正负号double fzs 1;//分子式double sum 0;while (fabs(fzs) > 0.000001) {sum fzs;sign * -1; //变换正负号fm 2; //分母3、5、7、9...增长fzs sign / fm;//分子式…...
fpga系列 HDL: 05 阻塞赋值(=)与非阻塞赋值(<=)
在Verilog硬件描述语言(HDL)中,信号的赋值方式主要分为两种:连续赋值和过程赋值。每种赋值方式有其独特的用途和语法,并适用于不同类型的电路描述。 1. 连续赋值(Continuous Assignment,assign 和…...
大白话DC3算法
DC3算法是什么 DC3算法(也称为Skew算法)是一种高效的构建后缀数组的算法,全称为Difference Cover Modulo 3算法。 该算法于2002年被提出,论文参考: https://www.cs.cmu.edu/~guyb/paralg/papers/KarkkainenSanders0…...
力扣HOT100 - 75. 颜色分类
解题思路: 单指针,对数组进行两次遍历。 class Solution {public void sortColors(int[] nums) {int p 0;int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {int tmp nums[i];nums[i] nums[p];nums[p] tmp;p;}}for (int i p; i …...
通过Taotoken模型广场对比不同模型在代码生成任务上的效果与成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken模型广场对比不同模型在代码生成任务上的效果与成本 对于开发者而言,选择合适的代码生成模型需要在效果、…...
AI工程化落地的五大技术坐标:Agent、MoE、端云协同与可观测性
1. 这份AI周刊到底在讲什么?一个从业十年的观察者视角你点开这份标题叫《This AI newsletter is all you need #91》的邮件,第一反应可能是:又一份信息过载的AI速报?别急,先放下“刷完就忘”的惯性。作为一个从2014年就…...
告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置
告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置 在数据中心网络架构中,Dragonfly拓扑以其高度可扩展性和低直径特性脱颖而出,成为超大规模计算环境的理想选择。然而,当面对对抗性流量模式时ÿ…...
AI驱动的JMeter脚本生成:基于OpenAPI契约与作用域约束的DSL构建
1. 这不是“AI写脚本”,而是把JMeter从“手绘电路图”升级成“EDA自动布线”你有没有在凌晨两点,对着Postman里复制粘贴的27个接口参数发呆?一边点开Swagger文档截图,一边在JMeter里手动拖拽HTTP请求、填Header、加JSON提取器、设…...
Richard Socher创业公司获6.5亿美元融资,欲让AI自动化研发引领底层范式转移
Richard Socher创业公司获巨额融资一家创业公司获得了GV(Alphabet旗下VC)和Greycroft共同领投的6.5亿美元早期融资,NVIDIA和AMD也参与本轮融资,它的估值达到了46.5亿美元。这家公司的创始人是Richard Socher,他是AI领域…...
JS逆向实战:加密库动态Hook的工程化落地方法
1. 这不是写个console.log就能搞定的事:为什么主流加密库的Hook总在关键时刻失效“JS逆向实战:一键Hook主流加密库的调试与拦截”——看到这个标题,很多刚入行的朋友第一反应是:“不就是给CryptoJS、SM2、RSA.js这些库的encrypt方…...
注意力的几何本质:一个空间与两个算子的统一框架
1. 项目概述:这不是又一篇讲Attention机制的“科普文”如果你最近翻过几篇顶会论文,或者在GitHub上扫过几个热门Transformer库的源码,大概率会在某个角落撞见“The Geometry of Attention: One Space, Two Operators”这个标题。它不像“Atte…...
AirPodsDesktop:在Windows上解锁苹果耳机的完整体验
AirPodsDesktop:在Windows上解锁苹果耳机的完整体验 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop 你是否曾经在W…...
为什么你的NotebookLM结论总被质疑?揭秘内部显著性引擎的3层贝叶斯校验链(含源码级日志解析)
更多请点击: https://codechina.net 第一章:NotebookLM显著性判断的底层逻辑悖论 NotebookLM 在处理用户上传文档并生成摘要或回答时,依赖“显著性判断”(Significance Scoring)机制对文本片段进行加权排序。该机制表…...
互联网大厂 Java 求职面试实战:音视频场景中的技术挑战
互联网大厂 Java 求职面试实战:音视频场景中的技术挑战在这个互联网飞速发展的时代,越来越多的求职者走进了大厂的面试现场。今天,我们将跟随一位搞笑的程序员燕双非,来看看他在面试中的表现,以及他如何应对各种技术问…...
