FFmpeg开发从mp4中提取aac音频

Posted h0pe43

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg开发从mp4中提取aac音频相关的知识,希望对你有一定的参考价值。

 AAC格式要在每个数据包前添加ADTS头,注意音频参数。

1 . avformat_open_input()  解码函数
https://blog.csdn.net/leixiaohua1020/article/details/8661601
https://blog.csdn.net/leixiaohua1020/article/details/44064715

打开输出的流和读取头信息。其原型如下:

int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 
•    ps:函数调用成功之后处理过的 AVFormatContext 结构体。
•    url:打开的视音频流的 URL。
•    fmt:强制指定 AVFormatContext 中 AVInputFormat 的。这个参数一般情况下可以设置为 NULL,这样 FFmpeg 可以自动检测 AVInputFormat。
•    options:附加的一些选项,一般情况下可以设置为 NULL。

函数执行成功的话,其返回值大于等于 0。

2.av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);

寻找最适合的流
-1:要处理的流的索引号,不知道填-1
-1:要处理的流相关流的索引号,比如视频的相关是音频,不知道填-1
NULL:流的编解码器,不关心填NULL
0:flag,不关心填0
返回值:小于0错误,不小于0则是要找的流的索引值。
 

#include<iostream>
using namespace std;
extern "C"

#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
;

void adts_header(char* szAdtsHeader, int dataLen) 

	int audio_object_type = 2;
	int sampling_frequency_index = 3;//48000HZ
	int channel_config = 2;

	int adtsLen = dataLen + 7;

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

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

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

	szAdtsHeader[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);     //frame length:value    中间8bits
	szAdtsHeader[5] = (uint8_t)((adtsLen & 0x7) << 5);       //frame length:value    低3bits
	szAdtsHeader[5] |= 0x1f;                                 //buffer fullness:0x7ff 高5bits
	szAdtsHeader[6] = 0xfc;


int main()


	AVFormatContext* fcontext = nullptr;
	AVPacket pkt ;
	avformat_open_input(&fcontext, "test.mp4", nullptr, nullptr);
	av_dump_format(fcontext, 0, "test.mp4", 0);
	FILE* outflie = fopen("test.aac", "wb");
	int ret=av_find_best_stream(fcontext, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
	
	int audio_index = ret;//查看索引值
	av_init_packet(&pkt);
	while (av_read_frame(fcontext,&pkt )>=0)
	
		if (pkt.stream_index == audio_index)
		
			char head[7] = 0;
			adts_header(head, pkt.size);
			fwrite(head, 1, 7, outflie);
			int len=fwrite(pkt.data, 1, pkt.size, outflie);
			cout << pkt.size << endl;
			if (len != pkt.size)
			
				cout << "error";
				return 0;

			

		
		av_packet_unref(&pkt);//数据释放
	
	

	avformat_close_input(&fcontext);
	fclose(outflie);

	return 0;

FFmpeg 命令行工具ffmpeg

参考技术A 注:先cd到文件所在地文件夹也是可以的,直接使用文件名

1.列出ffmpeg支持的所有格式:

2.剪切一段媒体文件,可以使音频或者视频文件:

3.将一个媒体文件切割成多个媒体文件:

4.提取一个视频文件中的音频文件:

5.提取一个视频文件中的视频文件:

6.从MP4文件中抽取视频流导出为裸H264数据:

7.使用AAC音频数据和H264视频数据生成MP4文件:

注意:使用上面生成的aac和h264文件生成新的mp4文件,视频播放速度会变快,暂时不知道怎么解决,终端的警告:

8.对音频文件的编码格式做转换:

9_1.从WAV音频文件中导出PCM裸数据:

9_2.PCM数据转WAV:

9_3.PCM数据转MP3:

10.重新编码视频文件,复制音频流,同时封装到MP4格式的文件中:

11.将一个MP4格式的视频转换成gif格式的动图:

12.将一个视频的画面部分生成图片,比如要分析一个视频里面的每一帧都是什么内容的时候:

13.使用一组图片生成一个gif:

14.使用音量效果器,改变一个音频媒体文件中的音量:

15.淡入效果器的使用:

16:淡出效果器的使用:

17:混音(将多路声音进行合并)

18:对声音进行变速但不变调效果器的使用:

19_1:为视频添加水印:

19_2:去掉视频水印:

20:视频提亮效果器的使用:

21:为视频增加对比度效果:

22:视频旋转效果器的使用:

23:视频裁剪效果器的使用:

24:将一张RGBA格式表示的数据转换成JPEG格式图片:

25:将一张YUV格式表示的数据转换成JPEG格式图片:

26:将一段视频推送到流媒体服务器上:

27:将流媒体服务器上的流dump到本地:

28:将两个音频文件以两路流到形式封装到一个文件中,比如在k歌的应用场景中,原唱伴唱实时切换的场景下,可以使用一个文件包含两路流,一路是伴奏流,一路是原唱流:

29:将输入的视频的分辨率改成960*540

以上是关于FFmpeg开发从mp4中提取aac音频的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MP4 文件中提取元数据轨道

Windows下ffmpeg批处理遍历当前文件夹下所有特定格式文件(如MP4等)无损提取视频音频且生成文件存到原视频文件夹下同时跳过已经处理的文件

Windows下ffmpeg批处理遍历当前文件夹下所有特定格式文件(如MP4等)无损提取视频音频且生成文件存到原视频文件夹下同时跳过已经处理的文件

Windows下ffmpeg批处理遍历当前文件夹下所有特定格式文件(如MP4等)无损提取视频音频且生成文件存到原视频文件夹下同时跳过已经处理的文件

音频压缩编码技术—ffmpeg命令方式生成AAC文件

音频压缩编码技术—ffmpeg命令方式生成AAC文件