ffmpeg-从flv文件中提取AAC音频数据保存为文件

AAC ADTS格式协议:
从flv文件中提取AAC音频数据保存为文件。
如果需要详细了解AAC ADTS格式,可以查询文档。

原文件:
在这里插入图片描述
提取aac文件:
在这里插入图片描述

main.c

#include <stdio.h>
#include <libavutil/log.h>>
#include <libavformat/avio.h>
#include <libavformat/avformat.h>#define        ADTS_HEADER_LEN      7;
const int sampling_frequencies[] =
{96000, //0x088200, //0x164000, //0x248000, //0x344100, //0x432000, //0x524000, //0x622050, //0x716000, //0x812000,  // 0x911025,  // 0xa8000   // 0xb// 0xc d e f是保留的
};int adts_header(char* const p_adts_header, const int data_length,const int profile, const int samplerate, const int channels)
{int sampling_frequencies_index = 3; //默认使用48000int adtsLen = data_length + 7;//根据输入文件的samplerate 获取 相应的在ADTS中设置的索引int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);int i = 0;for(i = 0; i < frequencies_size; i++){if(samplerate == sampling_frequencies[i]){sampling_frequencies_index = i;break;}}if(sampling_frequencies_index >= frequencies_size){printf("unsupport samplerate:%d\n", samplerate);return -1;}//同步头 总是0xFFF(12个bit),代表着一个ADTS帧的开始p_adts_header[0] = 0xff;p_adts_header[1] = 0xf0;//MPEG标识符,0标识MPEG-4,1标识MPEG-2(1个bit)p_adts_header[1] |= (0 << 3);//layer,总是0(2个bit)p_adts_header[1] |= (0 << 1);//protection_absent ,表示是否误码校验,1表示 没有, 0 表示有。(1个bit)//(注意:ADTS Header的长度在protection_absent = 0 时占9个字节, protection_absent = 1时占7个字节)p_adts_header[1] |= 1;//profile 使用aac的级别(质量)(2个bit)//MPEG-4 profile://MAIN  = 0//LC    = 1//SSR   = 2//LTP   = 3p_adts_header[2] = (profile)<<6;//采样率的索引(4个bit)p_adts_header[2] |= (sampling_frequencies_index & 0x0f) << 2;//private bit: 0 (1个bit)p_adts_header[2] |= (0 << 1);//声道(3个bit)p_adts_header[2] |= (channels & 0x04) >> 2;p_adts_header[3] = (channels & 0x03) << 6;//original_copy = 0 (1个bit)p_adts_header[3] |= (0 << 5);//home = 0 (1个bit)p_adts_header[3] |= (0 << 4);//copyright_identification_bit = 0 (1个bit)p_adts_header[3] |= (0 << 3);//copyright_identification_start = 0 (1个bit)p_adts_header[3] |= (0 << 2);//frame_length:1个ADTS帧的长度包括ADTS头和AAC原始流(13bit)p_adts_header[3] |= ((adtsLen & 0x1800) >> 11);p_adts_header[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);p_adts_header[5] = (uint8_t)((adtsLen & 0x7) << 5);//adts_buffer_fullness:0x7FF 说明是码率可变的码流p_adts_header[5] |= 0x1f;p_adts_header[6] = 0xfc;//最后还有两个bit:number_of_raw_data_blocks_in_frame//表示这个ADTS帧有几个AAC数据块//计算方法://number_of_raw_data_blocks_in_frame + 1个AAC原始帧。//所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个//AAC数据块。p_adts_header[6] &= 0xfc;//其实上面p_adts_header[6] = 0xfc的操作这2个bit已经为0了return 0;
}int main()
{int ret = -1;char errors[1024];char* in_filename = "in_file.flv";char* aac_filename = "test_out.aac";FILE* aac_fd = NULL;int audio_index = -1;int len = 0;AVFormatContext* ifmat_ctc = NULL;AVPacket pkt;//设置打印级别av_log_set_level(AV_LOG_DEBUG);aac_fd = fopen(aac_filename, "wb");if(!aac_fd){av_log(NULL, AV_LOG_DEBUG, "Could not open destination file %s\n", aac_filename);return -1;}//打开输入文件if((ret = avformat_open_input(&ifmat_ctc, in_filename, NULL, NULL)) < 0){av_strerror(ret, errors, 1024);av_log(NULL, AV_LOG_DEBUG, "Could not open source file: %s, %d(%s)\n",in_filename,ret,errors);return -1;}//获取解码器信息if((ret = avformat_find_stream_info(ifmat_ctc, NULL)) < 0){av_strerror(ret, errors, 1024);av_log(NULL, AV_LOG_DEBUG, "failed to find stream information: %s, %d(%s)\n",in_filename,ret,errors);return -1;}//dump媒体信息av_dump_format(ifmat_ctc, 0, in_filename, 0);//初始化packetav_init_packet(&pkt);//查找audio对应的stream indexaudio_index = av_find_best_stream(ifmat_ctc, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if(audio_index < 0){av_log(NULL, AV_LOG_DEBUG, "Could not find %s stream in input file %s\n",av_get_media_type_string(AVMEDIA_TYPE_AUDIO),in_filename);return AVERROR(EINVAL);}//打印aac级别printf("audio profile:%d , FF_PROFILE_AAC_LOW:%d\n",ifmat_ctc->streams[audio_index]->codecpar->profile,FF_PROFILE_AAC_LOW);if(ifmat_ctc->streams[audio_index]->codecpar->codec_id != AV_CODEC_ID_AAC){printf("the media file no contain AAC stream, it's codec_id is %d\n",ifmat_ctc->streams[audio_index]->codecpar->codec_id);goto END;}//读取媒体文件,并把aac数据帧写入本地文件while (av_read_frame(ifmat_ctc, &pkt) >=0 ){if(pkt.stream_index == audio_index){char adts_header_buf[7] = {0};//获取ADTS帧头信息adts_header(adts_header_buf, pkt.size,ifmat_ctc->streams[audio_index]->codecpar->profile,ifmat_ctc->streams[audio_index]->codecpar->sample_rate,ifmat_ctc->streams[audio_index]->codecpar->channels);//写入adts header,ts流不适用,ts流分离出来的packet带了adts headerfwrite(adts_header_buf, 1, 7, aac_fd);len = fwrite(pkt.data, 1, pkt.size, aac_fd);//写入adts dataif(len != pkt.size){av_log(NULL, AV_LOG_DEBUG, "warning, length of writed data isn't equal pkt.size(%d, %d)\n",len,pkt.size);}}av_packet_unref(&pkt);}END:if(ifmat_ctc)avformat_close_input(&ifmat_ctc);if(aac_fd)fclose(aac_fd);return 0;
}

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

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

相关文章

N Queen(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>/* 程序描述&#xff1a;输出N*N中符合左右对角线与上下左右方向都没被使用的位置在每一行的所有情况使用检测左上角&#xff0c;正上角&#xff0c;右上…

Python-身份证核对

中华人民共和国居民身份证号码由17 位数字和1位校验码组成。其中&#xff0c;前6位为所在地编号&#xff0c;第7~14 位为出生年月日&#xff0c;第15~17位为登记流水号&#xff0c;其中第17位偶数为女性&#xff0c;奇数为男性。校验码的生成规则如下: 将前面的身份证号码17位数…

树存储结构(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c 线性表 GTree.h #ifndef _GTREE_H_ #define _GTREE_H_typedef void GTree;//定义树类型 typedef void GTreeData;//定义节点中存放数据的类型 typedef void (GTre…

二元矩阵峰值搜索_好斗的牛(二元搜索)

二元矩阵峰值搜索A farmer has built a long barn with N stalls. The stalls are placed in a straight manner at positions from x1, x2, ...xN. But his cows (C) are aggressive and don’t want to be near other cows. To prevent cows from hurting each other, he wan…

Python---冒泡排序、选择排序

冒泡排序 依次输入n个数&#xff0c;进行冒泡排序 冒泡排序法&#xff0c;即两个相邻的进行比较&#xff0c;比较之后换位置 def bubbleSort(arr):n len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j1] :arr[j], arr[j1] arr[j1], arr[j]arr[] n…

react js 添加样式_如何在React JS Application中添加图像?

react js 添加样式Hello! In this article, we will learn how to add images in React JS? I remember when I just started coding in React JS, I thought adding images would be done exactly as it is in HTML. I later realized that it was different. 你好&#xff0…

二叉树(多路平衡搜索树)-(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h #ifndef _BTREE_H_ #define _BTREE_H_#define BT_LEFT 0 //定义左子节点标识 #define BT_RIGHT 1 //定义右子节点标识typedef void BTree;//定义树类型 typedef unsigned long lo…

Python---二分法查找

输入n个数&#xff0c;通过二分法查找该数的下标 def binarySearch(arr,value):m 0#开始n len(arr#最后)while m<n:mid(mn)//2#计算中间位置if valuearr[mid]:#查找成功&#xff0c;返回元素对应的位置return midelif value>arr[mid]:#在后面一半元素中继续查找mmid1e…

SQL捕获异常

原文地址 http://technet.microsoft.com/zh-cn/office/ms179296%28vsql.100%29在 Transact-SQL 中使用 TRY...CATCHTransact-SQL 代码中的错误可使用 TRY…CATCH 构造处理&#xff0c;此功能类似于 Microsoft Visual C 和 Microsoft Visual C# 语言的异常处理功能。TRY…CATCH …

二叉树遍历(代码,分析,汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; LinkQueue.h #ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_typedef void LinkQueue;//定义队列类型LinkQueue* LinkQueu…

Python---查找序列的最长递增子序列

查找序列的最长递增子序列 什么是序列的最长递增子序列&#xff1f; 答&#xff1a;在一个数值序列中&#xff0c;找到一个子序列&#xff0c;使得这个子序列元素的数值依次递增&#xff0c;并且这个子序列的长度尽可能地大。这就是所谓的最长递增子序列 from itertools impo…

ffmpeg-从mp4、flv、ts文件中提取264视频流数据

ffmpeg-从mp4、flv、ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #include <libavformat/avio.h> #include <libavformat/avformat.h>void proc(int need_to_annexb, char* in_file, char* out_file) {AVForma…

线索化二叉树(代码 、分析 、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; SeqList.h SeqList.c 顺序表 main.c #include <stdio.h> #include <stdlib.h> #include "BTree.h&qu…

Python---寻找给定序列中相差最小的两个数字

编写函数&#xff0c;寻找给定序列中相差最小的两个数字 def getTwoClosestElements(arr):#先进行排序&#xff0c;使得相邻元素最接近#相差最小的元素必然相邻seq sorted(arr)#先进行排序dif float(inf)#无穷大#遍历所有元素&#xff0c;两两比较&#xff0c;比较相邻元素的…

Python---利用蒙特.卡罗方法计算圆周率近似值

利用蒙特.卡罗方法计算圆周率近似值 什么是蒙特.卡罗方法&#xff1f; 答&#xff1a;蒙特卡罗方法是一种计算方法。原理是通过大量随机样本&#xff0c;去了解一个系统&#xff0c;进而得到所要计算的值。 正方形内部有一个相切的圆&#xff0c;它们的面积之比是π/4。 这里假…

FLV封装格式的分析

FLV封装格式的分析&#xff0c;各种详细的参数比较多没有详细解释&#xff0c;这是总体的格式分布。详细的参数说明可以参照文档。 以flv格式内封装的音频流是aac、视频流是h264分析&#xff1a; flv文件tag部分截图&#xff1a;可以看到音频TAG、视频TAG是交错存储的

《计算机基础复习》===数据库技术基础

数据库系统三级结构&#xff1a; 数据库系统一般划分为三个抽象级&#xff1a;用户级、概念级、物理级。 1&#xff09;用户级数据库&#xff1a;对应于外模式。它是用户看到和使用的数据库&#xff0c;又称用户视图&#xff1b;用户级数据库主要由外部记录组成&#xff0c;不同…

bs架构 erp 进销存_从依赖经验到用柔性ERP,企业少走了多少弯路?

企业在面对紧急订单时&#xff0c;传统企业将面临两难问题&#xff1a;如不接受紧急订单,可能会导致潜在的顾客丢失,损失市场占有率;接受紧急订单,可能会给企业带来很多管理上的问题,如材料采购、库存管理等。而企业通过信息化手段提升生产计划与控制的柔性&#xff0c;则可从容…

云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)

云端 是一个小软件&#xff0c;但又是一个大平台。安装云端之后&#xff0c;再使用其他软件不再需要安装——一点、下载、直接使用&#xff1b;并且&#xff0c;通过虚拟化的运行环境&#xff0c;能够保持系统长久的干净、绿色&#xff0c;并保持软件与系统的安全隔离——此方面…

MGraph图(代码、分析、汇编)

目录:代码&#xff1a;分析&#xff1a;汇编&#xff1a;MGrapth图表示有邻接矩阵的方式构成的图结构。邻接矩阵用两个数组保存数据&#xff0c;一个一维数组存储图中的顶点信息&#xff0c;一个二维数组存储图中边或弧的信息。无向图中的二维数组是个对称矩阵 1.0表示无边&…