音视频实战---读取音视频文件的AAC音频保存成aac文件

news2024/11/17 7:49:43

1、使用avformat_open_input函数打开音视频文件

2、使用avformat_find_stream_info函数获取解码器信息。

3、使用av_dump_format设置打印信息

4、使用av_init_packet初始化AVPacket。

5、使用av_find_best_stream查找对应音视频流的流下标。

6、使用av_read_frame读取音视频帧,判断AVPacket的stream_index是否等于音频下标。

7、如果是音频帧,则先写AAC存储格式ADTS头,然后写音频帧数据。

8、调用avformat_close_input关闭输入文件。

ADTS头部:

在这里插入图片描述

int adts_header(char * const p_adts_header, const int data_length,
                const int profile, const int samplerate,
                const int channels)
{

    int sampling_frequency_index = 3; // 默认使用48000hz
    int adtsLen = data_length + 7;

    int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);
    int i = 0;
    for(i = 0; i < frequencies_size; i++)
    {
        if(sampling_frequencies[i] == samplerate)
        {
            sampling_frequency_index = i;
            break;
        }
    }
    if(i >= frequencies_size)
    {
        printf("unsupport samplerate:%d\n", samplerate);
        return -1;
    }

    p_adts_header[0] = 0xff;         //syncword:0xfff                          高8bits
    p_adts_header[1] = 0xf0;         //syncword:0xfff                          低4bits
    p_adts_header[1] |= (0 << 3);    //MPEG Version:0 for MPEG-4,1 for MPEG-2  1bit
    p_adts_header[1] |= (0 << 1);    //Layer:0                                 2bits
    p_adts_header[1] |= 1;           //protection absent:1                     1bit

    p_adts_header[2] = (profile)<<6;            //profile:profile               2bits
    p_adts_header[2] |= (sampling_frequency_index & 0x0f)<<2; //sampling frequency index:sampling_frequency_index  4bits
    p_adts_header[2] |= (0 << 1);             //private bit:0                   1bit
    p_adts_header[2] |= (channels & 0x04)>>2; //channel configuration:channels  高1bit

    p_adts_header[3] = (channels & 0x03)<<6; //channel configuration:channels 低2bits
    p_adts_header[3] |= (0 << 5);               //original:0                1bit
    p_adts_header[3] |= (0 << 4);               //home:0                    1bit
    p_adts_header[3] |= (0 << 3);               //copyright id bit:0        1bit
    p_adts_header[3] |= (0 << 2);               //copyright id start:0      1bit
    p_adts_header[3] |= ((adtsLen & 0x1800) >> 11);           //frame length:value   高2bits

    p_adts_header[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);     //frame length:value    中间8bits
    p_adts_header[5] = (uint8_t)((adtsLen & 0x7) << 5);       //frame length:value    低3bits
    p_adts_header[5] |= 0x1f;                                 //buffer fullness:0x7ff 高5bits
    p_adts_header[6] = 0xfc;      //‭11111100‬       //buffer fullness:0x7ff 低6bits
    // number_of_raw_data_blocks_in_frame:
    //    表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动硬盘分区误删?别担心,数据恢复来帮忙!

在日常使用移动硬盘的过程中&#xff0c;有时会因为各种原因导致分区被误删。这种情况一旦发生&#xff0c;很多人会感到惊慌失措&#xff0c;担心数据丢失无法找回。然而&#xff0c;只要及时采取正确的数据恢复措施&#xff0c;大多数情况下都能够成功恢复误删的分区和数据。…

变量直接赋值、浅拷贝、深拷贝、递归、异常

对象拷贝(对象存在堆中) 变量直接赋值 赋值 就是一个&#xff0c;比如let obj2obj1 这就是赋值&#xff0c;只是把栈中存储的值&#xff0c;赋值给另一个变量 把obj1在栈中的地址&#xff0c;赋值给obj2 <script>let str hellolet str2 str //把str的值,赋值给str2.也…

公派访问学者申请被拒签的原因有哪些?

在申请公派访问学者时&#xff0c;拒签是一种常见的结果&#xff0c;其原因多种多样。首先&#xff0c;申请材料不完整或者不符合要求可能是导致拒签的主要原因之一。例如&#xff0c;个人简历、研究计划书、推荐信等材料未能清晰地展示申请人的学术背景和研究意图&#xff0c;…

想零基础转行Python开发,怎么学习呢?

转行零基础学Python编程开发难度大吗&#xff1f;从哪学起&#xff1f;近期很多小伙伴问我&#xff0c;如果自己转行学习Python&#xff0c;完全0基础能否学会呢&#xff1f;Python的难度到底有多大&#xff1f;今天&#xff0c;小编就来为大家详细解读一下这个问题。 学习 Py…

蓝桥杯刷题|02入门真题

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数…

用这个工具制作企业宣传册,效果也太酷了

​随着市场的竞争日益激烈&#xff0c;企业的宣传册成为了展示企业形象和实力的重要途径。而如何制作一份既美观又实用的宣传册&#xff0c;成为了许多企业家和设计师们关注的焦点。 今天&#xff0c;笔者要向大家介绍的就是这样一款工具&#xff0c;它能够让用户轻松制作出既具…

软件测试中的AI-为什么它在软件自动化测试中很重要?

通俗地说&#xff0c;人工智能&#xff08;AI&#xff09;是计算机科学的一个领域&#xff0c;它专注于使机器“智能化”。所谓智能&#xff0c;就是使系统能够像人类一样学习和做出决策。因此&#xff0c;人工智能机器将能够学习如何在特定情况下做出反应&#xff0c;然后根据…

基于springboot社团管理系统的设计与实现

互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳…

使用vscode+clangd+bear+publickeyssh远程开发Linux程序

目录 配置ssh密钥远程登录登录远程Linux主机安装必要软件安装vscode插件1.安装remote-ssh插件2.通过vscode远程连接到linux机器3.在远程安装插件clangd4.关闭C/C Intellense engine 使用vscodeclangdbear1.修改Makefile2.编译内核3.结果 配置ssh密钥远程登录 一定要配置成密钥…

Nacos安装遇到的问题

Windows安装nacos双击startup.cmd执行出错 改成用cmd窗口输入命令 startup.cmd -m standalone启动之后登录的问题 权限认证失败 没有 命名空间的访问权限&#xff01; 把默认的登录url改成&#xff1a; http://127.0.0.1:8848/nacos/#/login登录之后&#xff0c;点击导入配置…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高&#xff0c;出行方式多样化&#xff0c;也以私家车为主&#xff0c;那么既然私家车的需求不断增长&#xff0c;那么基于驾校的考核管理也就不断增强&#xff0c;那么业务系统也就慢慢的随之加大。信息…

用python证明一生一世很容易,但要爱一个人一生一世就比较难了

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

halconOCR文字识别

1、OCR文字识别 FontFile : Universal_0-9_NoRej dev_update_window (off) read_image (bottle, bottle2) get_image_size (bottle, Width, Height) dev_open_window (0, 0, Width, Height, black, WindowHandle) set_display_font (WindowHandle, 16, mono, true, false) dev…

JS-06-数组

一、数组的创建与访问 见&#xff1a;JS-04-javaScript数据类型和变量 JavaScript的Array可以包含任意数据类型&#xff0c;并通过索引来访问每个元素。 要取得Array的长度&#xff0c;直接访问length属性&#xff1a; let arr [1, 2, 3.14, Hello, null, true]; console.l…

单头注意力机制(ScaledDotProductAttention) python实现

输入是query和 key-value&#xff0c;注意力机制首先计算query与每个key的关联性&#xff08;compatibility&#xff09;&#xff0c;每个关联性作为每个value的权重&#xff08;weight&#xff09;&#xff0c;各个权重与value的乘积相加得到输出。 import torch import tor…

AS-V1000 视频监控平台产品介绍:web客户端功能介绍(上)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2 平台服务器配置说明 二、软件概述 2.1 软件用途 2.2 登陆界面 2.3 主界面 2.4 视频浏览 三、web端主要功能介绍 3.1 多画面风格 3.1.1风格切换 3.1.2 切换效果 3.2截屏 3.2.1 单画面截屏 3.2.2 …

【当前全网最详细】WebUI中使用Instant_ID来控制生成对象面部的用法

&#x1f388;为什么有这篇文章 中文网络上或者B站很多UP&#xff0c;在讲述WebUI中使用这个controlnet来换脸的时候&#xff0c;要么讲的过于复杂&#xff0c;要么就是没有讲清楚&#xff0c;所以这里整理下详细的使用方法&#xff0c;并记录下生成的内容。 如果懒得看文字可…

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

visa卡支持美区苹果Apple id绑定

苹果手机我相信大家都很熟悉&#xff0c;所以很多小伙伴都需要绑定卡来进行一系列的体验&#xff0c;这里我使用的是559666 在绑定之前我们需要先开一张visa卡&#xff0c;点击获取 开卡步骤如下&#xff0c;按图片步骤即可开卡 卡片信息在卡中心cvc安全码里面

STM32F407_外部中断

这里写目录标题 前言1、EXTI概述2、外部中断配置流程完整代码 前言 注释很详细&#xff0c;放心食用。 1、EXTI概述 STM32F4的每个IO都可以作为外部中断的中断输入口&#xff0c;这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断线上都设…