ffmpeg命令分析-acc

news/2024/11/29 21:41:17/

本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8

 

本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。


命令如下:ffmpeg -i a.mp4 -vn -acodec copy output.aac

FFmpeg 抽取音视频文件 中的 AAC 音频 流,与上一条命令 ffmpeg -i a.mp4 -vn -acodec copy output.mp4 相比。

只是封装格式不同,这篇文章就来讲解,如果输出文件不是 mp4,而是aac的封装格式,ffmpeg是如何处理。


命令行参数 -vn 上篇文章已经讲解过它的实现原理,就不再重复讲解了。

输出文件 output.aac 跟 output.mp4 ,格式虽然不同,但在 ffmpeg.c 这个工程里面其实并没有做任何特殊的处理,你调 ffmpeg 的api函数 avio_open2(),只要传递不同后缀的文件名,avio_open2 内部就会根据不同的文件名后缀,生成不同的 AVOutputFormat 放进去 AVFormatContext 的 oformat 字段里。

请看下图,在 avio_open2() 后面打了断点。

然后,在ffmpeg 4.2 的源码里搜索 "ADTS AAC (Advanced Audio Coding)" 字符串,可以发现 aac 的封装格式是在 libavformat 目录的 adtsenc.c 里面,如下:

libavformat/adtsenc.c 229行
AVOutputFormat ff_adts_muxer = {.name              = "adts",.long_name         = NULL_IF_CONFIG_SMALL("ADTS AAC (Advanced Audio Coding)"),.mime_type         = "audio/aac",.extensions        = "aac,adts",.priv_data_size    = sizeof(ADTSContext),.audio_codec       = AV_CODEC_ID_AAC,.video_codec       = AV_CODEC_ID_NONE,.init              = adts_init,.write_header      = adts_write_header,.write_packet      = adts_write_packet,.write_trailer     = adts_write_trailer,.priv_class        = &adts_muxer_class,.flags             = AVFMT_NOTIMESTAMPS,
};

MP4 后缀的文件名,原理类似,mp4 的封装格式文件是 libavformat/movenc.c,具体自行查看。

虽然 aac 是编码层的封装格式,mp4 是容器层的格式,但是ffmpeg把他们都放到了 libavformat 下,个人觉得比较新奇。

总结:

ffmpeg 实现不同封装格式,是通过一种多态的方式实现的。不同后缀,就用不同的AVOutputFormat来实现。

在使用 avio_open2() API函数的时候,可以不管底层实现,直接传递不同后缀的文件名 即可完成不同格式的封装。


由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习


http://www.ppmy.cn/news/805878.html

相关文章

acc之ADTS解说一

AAC概述 AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年&#xff…

Java借助ffmpeg进行音视频的格式转换(如m4a转mp3)

FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或GPL 许可证(依据你选择的组件) FFmpeg 官网: FFMPEG分为3个版本:Static,Shared,Dev。 前两个版本可以直接在命令行中使用,他们的区别在于: Static里面只有3个应用程序:ffmpeg.exe,ffp…

MediaCodec AudioTrack 硬解AAC格式音频(二)

在上一篇文章介绍了 MediaCodec AudioRecord 硬编 AAC 格式音频,这篇介绍如何用 MediaCodec 硬解码 AAC 文件,并使用 AudioTrack 播放,总体相对而言遇到的坑比硬编要少一些。 介绍 MediaCodec MediaCodec 是 Android 用于音视频编解码的一…

计算机硬件acc作用,累加器A的主要作用是什么_一文解析累加器a和acc的区别

累加器简介 在中央处理器中,累加器(accumulator) 是一种寄存器,用来储存计算产生的中间结果。如果没有像累加器这样的寄存器,那么在每次计算 (加法,乘法,移位等等) 后就必须要把结果写回到内存,也许马上就得读回来。然而存取主存的速度是比从算术逻辑单元到有直接路径的累…

ACC编码

AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>80Kbps)&…

java解码acc音频文件_(JAVA)将(acc/m4a)音频转换成Mp3格式

实际工作中有一个需求,就是上传到微信的音频(格式为m4a)在PC浏览器无法播放,需要转码成mp3,然后在PC端播放(其实后来发现HTML5的audio可以播放...),该工具依赖jave-1.0.2.2.jar(http://download.csdn.net/download/tinnkenn/93944…

请问android如何录制acc格式音频

问题描述 我这边要即时通讯。acc跟ios可以互通。但是录制的时候选项没有acc是要转换么 解决方案1 AudioRecord 获取 sample 然后用 ffmpeg 转成 AAC 转载于:https://www.cnblogs.com/yiguobei99/p/4002004.html

FFMPEG编码实现:pcm编码为acc

本程序流程: 1、创建输出码流的上下文AVFormatContext,并初始化 2、打开输出文件:avio_open2() 3、创建新流:avformat_new_stream() //用于保存音频流信息,一个完整的视频文件包含多个流信息:视频流、音频…