【音视频】AVIO输入模式
内存IO模式
AVIOContext *avio_alloc_context(
unsigned char *buffer,
int buffer_size,
int write_flag,
void *opaque,
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence)
);
参数说明:
- opaque是 read_packet / write_packet 的第⼀个参数,指向⽤户数据。
- buffer和buffer_size是 read_packet / write_packet 的第⼆个和第三个参数,是供FFmpeg使⽤的数据区。
- buffer ⽤作FFmpeg输⼊时,由⽤户负责向 buffer 中填充数据,FFmpeg取⾛数据。
- buffer ⽤作FFmpeg输出时,由FFmpeg负责向 buffer 中填充数据,⽤户取⾛数据。
- write_flag是缓冲区读写标志,读写的主语是指FFmpeg。
- write_flag 为1时, buffer ⽤于写,即作为FFmpeg输出。
- write_flag 为0时, buffer ⽤于读,即作为FFmpeg输⼊。
- read_packet和write_packet是函数指针,指向⽤户编写的回调函数。
- seek也是函数指针,需要⽀持seek时使⽤。 可以类⽐fseek的机制
一、avio_alloc_context 的环形缓冲本质
avio_alloc_context
创建的 AVIOContext 结构体 内部维护了一个环形缓冲区,其核心特性包括:
- 循环存储机制
- 缓冲区逻辑上首尾相连,数据写入时自动回绕(Wrap-Around),避免频繁内存分配。
- 例如,当缓冲区写满后,新数据会覆盖最早写入的数据(取决于配置)。
- 双指针管理
- 读指针(buf_ptr):指向当前读取位置。
- 写指针(buf_end):指向当前写入位置。
- 通过模运算(
%
)实现指针的循环移动,例如:
buf_ptr = (buf_ptr + size) % buffer_size
。
- 缓冲与性能优化
- 预分配固定大小的内存(如 4KB、8KB),减少系统调用次数。
- 适用于网络流、内存数据流等需要连续读写的场景。
实现流程
准备文件
在build
路径下准备相关mp3
和aac
文件
添加main
函数参数,表示输入文件和输出文件
打开文件
使用FILE
二进制打开输入文件和输出文件
const char *in_file_name = argv[1];
const char *out_file_name = argv[2];
FILE *in_file = NULL;
FILE *out_file = NULL;// 1. 打开参数文件
in_file = fopen(in_file_name, "rb");
if(!in_file) {printf("open file %s failed\n", in_file_name);return -1;
}
out_file = fopen(out_file_name, "wb");
if(!out_file) {printf("open file %s failed\n", out_file_name);return -1;
}
自定义IO
读取
- 为
AVFormatContex
添加自定义读取规则,即自己实现一个AVIOContext
,而不是使用默认的 AVIOContext
使用的是环形缓冲区,即缓冲区满的时候覆盖前面的缓冲区- 需要设置环形缓冲区的大小、文件指针、以及缓冲内存回调函数,在内存数据读完的时候触发回调函数,继续从文件读取数据到环形缓冲区
uint8_t *io_buffer = av_malloc(BUF_SIZE);
AVIOContext *avio_ctx = avio_alloc_context(io_buffer, BUF_SIZE, 0, (void *)in_file, \read_packet, NULL, NULL);
AVFormatContext *format_ctx = avformat_alloc_context();
format_ctx->pb = avio_ctx;
int ret = avformat_open_input(&format_ctx, NULL, NULL, NULL);
if(ret < 0) {printf("avformat_open_input failed:%s\n", av_err2str(ret));return -1;
}
read_packet
回调函数
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
{FILE *in_file = (FILE *)opaque;int read_size = fread(buf, 1, buf_size, in_file);// printf("read_packet read/*_*/size:%d, buf_size:%d\n", read_size, buf_size);if(read_size <=0) {return AVERROR_EOF; // 数据读取完毕}return read_size;
}
查找解码器
- 根据
ID
查找解码器,这里直接查找AAC
解码器 - 分配解码器上下文,将解码器绑定到上下文中
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
if(!codec_ctx) {printf("avcodec_alloc_context3 failed\n");return -1;
}
ret = avcodec_open2(codec_ctx, codec, NULL);
if(ret < 0) {printf("avcodec_open2 failed:%s\n", av_err2str(ret));return -1;
}
解码并写入文件
- 将格式上下文信息拷贝到数据包(
packet
)中
AVPacket *packet = av_packet_alloc();
ret = av_read_frame(format_ctx, packet);
- 发送
packet
到解码器
ret = avcodec_send_packet(dec_ctx, packet);
- 使用帧(
frame
)接收解码后的裸流数据
ret = avcodec_receive_frame(dec_ctx, frame);
- 获取单个采样点的数据大小,左右声道依次写入数据
int data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);
for(int i = 0; i < frame->nb_samples; i++) {
for(int ch = 0; ch < dec_ctx->channels; ch++) {fwrite(frame->data[ch] + data_size *i, 1, data_size, outfile);}
}
- 操作代码如下
while (1) {ret = av_read_frame(format_ctx, packet);if(ret < 0) {printf("av_read_frame failed:%s\n", av_err2str(ret));break;}decode(codec_ctx, packet, frame, out_file);
}
decode
函数
static void decode(AVCodecContext *dec_ctx, AVPacket *packet, AVFrame *frame,FILE *outfile)
{int ret = 0;ret = avcodec_send_packet(dec_ctx, packet);if(ret == AVERROR(EAGAIN)) {printf("Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");} else if(ret < 0) {printf("Error submitting the packet to the decoder, err:%s\n",av_get_err(ret));return;}while (ret >= 0) {ret = avcodec_receive_frame(dec_ctx, frame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {return;} else if (ret < 0) {printf("Error during decoding\n");exit(1);}if(!packet) {printf("get flush frame\n");}int data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);// print_sample_format(frame);/**P表示Planar(平面),其数据格式排列方式为 :LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL...(每个LLLLLLRRRRRR为一个音频帧)而不带P的数据格式(即交错排列)排列方式为:LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRL...(每个LR为一个音频样本)播放范例: ffplay -ar 48000 -ac 2 -f f32le believe.pcm并不是每一种都是这样的格式*/// 这里的写法不是通用,通用要调用重采样的函数去实现// 这里只是针对解码出来是planar格式的转换for(int i = 0; i < frame->nb_samples; i++) {for(int ch = 0; ch < dec_ctx->channels; ch++) {fwrite(frame->data[ch] + data_size *i, 1, data_size, outfile);}}}
}
冲刷解码器
- 解码结束后要冲刷解码器,刷新解码器数据
decode(codec_ctx, NULL, frame, out_file);
结束操作
退出之前要释放内存、关闭文件
fclose(in_file);
fclose(out_file);av_free(io_buffer);
av_frame_free(frame);
av_packet_free(packet);avformat_close_input(&format_ctx);
avcodec_free_context(&codec_ctx);
更多资料:https://github.com/0voice
相关文章:
【音视频】AVIO输入模式
内存IO模式 AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(…...
Android中的多线程
线程池 在编程中经常会使用线程来异步处理任务,但是每个线程的创建和销毁都需要一定的开销。如果每次执行一个任务都需要开一个新线程去执行,则这些线程的创建和销毁将消耗大量的资源。并且线程都是“各自为政”,很难对其进行控制,…...
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
文章目录 题目宽搜代码总结 题目 总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left t…...
deep鼠标跟随插件
效果图 实现 首先打开深度系统终端,键入以下安装命令: sudo apt install oneko安装完成后,执行以下命令启动: oneko启动后,就会出现小猫咪,如果终端不关(服务不关),会…...
Verilog 语法 (二)
在掌握了 Verilog 的基础语法和常用程序框架之后,本节将带大家深入学习一些 高级设计知识点。这些内容包括: 阻塞赋值()与非阻塞赋值(<)的区别及使用场景; assign 和 always 语句的差异&am…...
大数据开发环境的安装,配置(Hadoop)
1. 三台linux服务器的安装 1. 安装VMware VMware虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。 我们可以通过VMware来安装我们的linux虚拟机…...
唯创安全:从传统到智能,工厂智能叉车AI防撞系统解决方案
一、叉车安全管理现状痛点分析 1、司机管理难题 • 违规操作频发:无证驾驶、疲劳驾驶(如作业中吸烟/玩手机)及不系安全带现象普遍,事故风险与法律风险双高。 • 资源分配失衡:未经授权使用导致车辆调度混乱,影响作业效率。 2、…...
Windows与CasaOS跨平台文件同步:SyncThing本地部署与同步配置流程
文章目录 前言1. 添加镜像源2. 应用安装测试3. 安装syncthing3.1 更新应用中心3.2 SyncThing安装与配置3.3 Syncthing使用演示 4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…...
基于Django的个性化股票交易管理系统
本项目基于Python3.6、Django2.1、MySql8.0(最好不要使用5.6,字符集等方面均不兼容,否则导入数据库会出错)与股票信息工具包TuShare实现。 创建或激活对应Python开发环境 这里使用了conda来管理环境,强烈推荐…...
Python图像变清晰与锐化,调整对比度,高斯滤波除躁,卷积锐化,中值滤波钝化,神经网络变清晰
本次使用图片来源于百度 import cv2 import time import numpy as np import pywtfrom PIL import Image, ImageEnhance#-i https://pypi.mirrors.ustc.edu.cn/simpledef super_resolution(input_path, output_path, model_path, scale4):# 初始化超分辨率模型sr cv2.dnn_su…...
带根线就无敌?光纤无人机如何成为电子战的终结者
在硝烟弥漫的俄乌战场上,一条超细光缆正在悄然改变战争规则。2024年俄军首次在前线部署光纤FPV无人机,其通过释放光纤线缆传输数据,成功对乌军装甲目标实施精准打击。乌方同时也迅速跟进,于 2025 年初量产光纤FPV 无人机以突破俄军…...
windows 和ubuntu静态路由配置
目录 windows 1 查看当前路由表 2 添加静态路由 3 删除路由 ubuntu route命令(传统方式) 使用ip指令(推荐) ubuntu永久路由配置 子网掩码解释 windows 1 查看当前路由表 -4 只关注ipv4,-6 用于指定显示 IPv6 …...
《深入理解计算机系统》阅读笔记之第四章 处理器体系结构
概述 备注:怎么感觉讲的还是《编码》这本书里面提到的知识点?...
vue项目前后端分离设计
在Vue前端架构中,通过分层结构和模块化设计实现高效的前后端分离,需要系统性规划各层职责、接口管理和数据流控制。以下是结合业界最佳实践的完整方案: 一、分层架构设计 1. 分层结构(自上而下) 层级职责示例技术实现…...
Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?
Steam游戏服务器的DDoS攻防体系设计,从协议层漏洞利用到业务连续性保障,深度拆解反射型攻击、TCP状态耗尽等7类威胁场景。基于全球15个游戏厂商攻防实战数据,提供包含边缘节点调度、AI流量指纹识别、SteamCMD加固配置的三维防护方案ÿ…...
七、web自动化测试03
目录 一、xpath定位1. 属性定位2.属性与逻辑结合3. 属性与层级结合 二、cookie1. 验证码处理方案2. cookie3. 案例:cookie跳过登录 三、pytest1. 介绍及安装2. 定义用例3. 执行测试用例3.1 命令行运行3.2 配置文件运行3.3 项目配置文件config.py 4. 参数化5. 断言6.…...
企业级AI开发利器:Spring AI框架深度解析与实战
企业级AI开发利器:Spring AI框架深度解析与实战 一、前言:Java生态的AI新纪元 在人工智能技术爆发式发展的今天,Java开发者面临着一个新的挑战:如何将大语言模型(LLMs)和生成式AI(GenAI&#…...
docker-compose安装RustDesk远程工具
以下是使用 docker-compose 部署 RustDesk 服务端(ID服务器 hbbs + 中继服务器 hbbr)的完整流程: 1. 创建 docker-compose.yml mkdir -p ~/rustdesk && cd ~/rustdesk vi docker-compose.ymlversion: 3.8services...
Qt基础009(HTTP编程和QJSON)
文章目录 软件开发网络架构BS架构/CS架构 HTTP基本概念QT的HTTP编程JSON数据概述QT生成JSON数据QT解析JSON数据 软件开发网络架构 BS架构/CS架构 在计算机网络和软件开发中,CS架构(Client-Server Architecture,客户端-服务器架构&#x…...
学习整理在centos7上安装mysql8.0版本教程
学习整理在centos7上安装mysql8.0版本教程 查看linux系统版本下载mysql数据库安装环境检查解压mysql安装包创建MySQL需要的目录及授权新增用户组新增组用户配置mysql环境变量编写MySQL配置文件初始化数据库初始化msyql服务启动mysql修改初始化密码配置Linux 系统服务工具,使My…...
第R4周:LSTM-火灾温度预测
文章目录 一、前期准备工作1.导入数据2. 数据集可视化 二、构建数据集1. 数据集预处理2. 设置X, y3. 划分数据集 三、模型训练1. 构建模型2. 定义训练函数3. 定义测试函数4. 正式训练模型 四、模型评估1. Loss图片2. 调用模型进行预测3. R2值评估 总结: ἶ…...
Linux文件管理完全指南:从命名规则到压缩解压
一、文件命名规则:避免踩坑的关键 1. 允许的字符与命名建议 允许字符:除 / 外所有字符均可使用,但需避免 <, >, ?, * 等特殊符号。 命名建议: 统一使用小写字母(Linux严格区分大小写)。 用下划线…...
react和vue的区别之一
前言 小编在学react的时候,发现react在使用ant-design组件的from表单,有点惊奇,跟vue差别确实有点大。 1-React 与 Vue 表单处理对比指南 核心差异概述 特性VueReact (Ant Design Form)数据定义必须显式定义 reactive/ref通过 name 隐式定…...
电力系统最小惯性常数解析
1. 什么是惯性常数? 电力系统的惯性常数(Inertia Constant)可以理解为系统抵抗频率突变的能力,类似于“惯性”。传统电力系统中,同步发电机(如火电厂)的旋转部件(如涡轮、转子&…...
Linux软硬链接和动静态库(20)
文章目录 前言一、软硬链接基本认知实现原理应用场景取消链接ACM时间 二、动静态库认识库库的作用 三、制作静态库静态库的打包静态库的使用 四、制作动态库动态区的打包动态库的链接与使用动态库的链接原理 总结 前言 我有款非常喜欢玩的游戏,叫做《饥荒》…...
FX10(CYUSB4014)USB3.2(10Gbps)开发笔记分享(1):硬件设计与开发环境搭建
作者:Hello,Panda 大家早上好,中午好,下午好,晚上好,熊猫君又来了。这次计划做一个连载,大概6期左右,主要介绍英飞凌最新的FX5/10/20的器件应用。目前,熊猫君手上调试的…...
【工具变量】上市公司-“链主“企业相关数据(2001-2024年)
上市公司的"链主企业"(Anchor Enterprise)指在其供应链中具有较较高中心度的公司。这些公司通过其规模、技术优势、资源整合能力等,影响和带动整个产业链的发展与运作。这些企业往往是供应链中最重要的节点,其决策和行为…...
Qt知识点1『16进制数值与文本互相转换』
工作中可能会遇到QByteArray保存着16进制的数据,例如网络传输中的数据在抓包软件下就会显示为16进制的文本格式。本次是在串口通讯首发消息时遇到的这类转换问题,做一下记录。 一、16进制的文本字符串如何转换数值 解决:形如QString("0…...
MongoDB Shard Cluster
# MongoDB Shard Cluster 集群规划 132上面单独安装mongos 在 1,2,3上面安装shard1和config 在 4,5,6上面安装shard2 节点host如下 172.20.192.20 member1.blockin.ai 172.20.192.21 member2.blockin.ai 172.20.192.31 member3.blockin.ai …...
Pycharm(六):可变与不可变类型
一、引用 在java中既有值传递,也有引用传递,我们思考一下在python中值的传递方式是哪种类型呢? 答案是引用传递。 概述: Python中存储变量是需要占用内存空间的,为了更好地管理这些空间,每块空间都是有自己的地址值的。 格式: id(变量名/值) 可以查看变量/…...
每日算法-250425
每日算法打卡 - 2025年4月25日 记录今天完成的几道 LeetCode 算法题,分享解题思路和代码。 2178. 拆分成最多数目的正偶数之和 题目 解题思路 贪心算法 解题过程 题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。 为了使拆分出的数字数量…...
github把自己的jar包发送到maven中央仓库
maven中央仓库注册账号 《Maven中央仓库官网》 注册账号 直接使用github账号 他会自动帮我们创建一个github的命名空间 获取自己的User Token 切记立马复制、保存username和password,后面maven的settings.xml会用到,因为这个页面会在一分钟以后自动关闭…...
链表系列一>两两交换链表中的结点
目录 题目:解析:代码: 题目: 链接: link 解析: 代码: /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int va…...
【深度强化学习 DRL 快速实践】异步优势演员评论员算法 (A3C)
Asynchronous Advantage Actor-Critic A3C (2016, DeepMind) 异步优势演员评论员算法 (A3C): 继承 actor-critic 的优势,同时通过异步多线程 (团队作战) 加速了训练过程 model-free, actor-critic 核心改进点说明异步并行训练 – Asynchronous (无经验回放)通过多个…...
240425 leetcode exercises
240425 leetcode exercises jarringslee 文章目录 240425 leetcode exercises[147. 对链表进行插入排序](https://leetcode.cn/problems/insertion-sort-list/)🔁插入排序 [1721. 交换链表中的节点](https://leetcode.cn/problems/swapping-nodes-in-a-linked-list…...
找三维gis开发的工作,Mapbox要学到什么程度?
Mapbox 是⼀个可以创建各种⾃定义地图的⽹站,如 Pinterest、Evernote、Github、500px 等⼤牌都使⽤ Mapbox 创建⾃⼰的地图,Mapbox 宣称要构建世界上最漂亮的地图。已为 Foursquare、Pinterest、Evernote、⾦融时报、天⽓频道、优步科技 等公司的⽹站提供…...
ThinkPHP6模型中多组条件逻辑或Or查询的使用
直接进入正题,如我们的查询条件是这样的: (age > 20 and job_id 3) or (sex 1 and age < 20) 上面两组数据之间是 Or 的关系。 可使用两个闭包进行查询,代码如下: $map1 [age > 30,sex > $id,];$map2 …...
《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...
netcore8.0项目发布到centos,利用nginx反向代理(宝塔面板篇)
1、发布netcore项目 在program.cs中配置nginx代理 // 添加Nginx反向代理支持 builder.Services.Configure<ForwardedHeadersOptions>(options > {options.ForwardedHeaders ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;options.KnownNetwo…...
项目笔记1:通用 Service的常见方法
通用 Service 通常封装了常见的业务逻辑操作,以提高代码的复用性和可维护性。不同的框架和业务场景下,通用 Service 的方法会有所差异,但一般都会包含一些基本的增删改查(CRUD)操作,以下为你详细介绍&#…...
VUE3父子组件defineModel动态值获取及处理
需求:子组件获取父组件value值时需处理,子组件加载时用onMounted,value变化时用watch 父组件: <template><div><p>父组件的值: {{ parentValue }}</p><button click"changeValue">改变…...
CUDA编程之Grid、Block、Thread线程模型
一、线程模型:Grid、Block、Thread概念 1. 层级定义 Thread(线程) CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间。 Block(线程块) 由多个线程组成(通常为32的倍数),是逻辑上的并…...
BT151-ASEMI无人机专用功率器件BT151
编辑:ll BT151-ASEMI无人机专用功率器件BT151 型号:BT151 品牌:ASEMI 封装:TO-220F 批号:最新 引脚数量:3 特性:单向可控硅 工作温度:-40℃~150℃ BT151单向可控硅产品解…...
无人机环境适应性与稳定性技术要点!
1. 环境感知与传感器融合 多传感器集成:结合IMU(惯性测量单元)、GPS、气压计、激光雷达(LiDAR)、视觉传感器(RGB/深度相机)、超声波等,实现冗余数据采集。 实时环境建模࿱…...
BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化
引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...
HTMLcss实现网站抽奖
代码由 HTML、CSS 和 JavaScript 三部分组成,HTML 负责页面的结构搭建,CSS 负责页面的样式设计,JavaScript 负责实现抽奖的交互逻辑。 HTML 部分 <!DOCTYPE html> <html lang"en"><head><meta charset"…...
字节:视频一致性生成论文速读
一、引言 Phantom: Subject-Consistent Video Generation via Cross-Modal Alignment 是北京字节跳动智能创作团队提出的一种新型视频生成方法,旨在解决主体一致性视频生成的难题。该方法通过平衡文本和图像的双重模态提示,实现文本和视觉内容的深度对齐…...
JAVA常用分布式锁Redisson
1. 加锁过程 底层命令与数据结构 Redis 数据结构:使用 Hash 结构存储锁信息,Key 为锁名称,Field 为客户端唯一标识(如 UUID 线程ID),Value 为锁的重入次数。 Lua 脚本原子性:通过 Lua 脚本在…...
9.ArkUI List的介绍和使用
ArkUI List 组件详解与使用指南 List 是 ArkUI(HarmonyOS 开发框架)中用于展示长列表数据的高性能滚动容器组件。以下是 List 的详细介绍和使用方法。 基本介绍 List 组件特点: 支持垂直/水平滚动高性能渲染(仅渲染可视区域内…...
深度解析:从12306看混合云架构下的高并发系统设计
作为曾参与12306余票查询系统高并发升级的技术从业者,笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思,特此分享十年前的架构解密文献(该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode,代码库详见…...