如何将音频文件进行编码|音乐文件如何转码

⑴ Nero快速转换音频文件

Nero想必大家已不陌生,虽然Nero的主要功能是刻录,但是它自带的一些工具确实不错,下面我就给大家介绍一下,希望对你有所帮助。笔者使用的是Nero6,Nero在安装后会在桌面上建立一个NeroStartSmart的快捷方式,如果桌面上没有可以到开始菜单中找到,这里就不多说了。然后启动NSS并在主界面中将标准模式设为专家模式,然后选择“对音频文件进行编码”进入编码文件窗口,按添加按钮一次或多次添加音频文件,如笔者需要将MP3文件转换成CD格式的WAV,然后将输出格式选择PCMWavefile,点击右侧的设置来设置输出后音频的质量,设置完并选择好目标文件存储的文件夹后按继续按钮,此时系统就会自动将在等待转换文件列表中的文件进行转换,如图所示编辑提示:如果将其它格式的音频文件转换成MP3,Nero只允许30次的转换次数,30次以后无法继续使用。

⑵ 音乐文件如何转码

你好,很高兴能为您解答问题。

首先为你解释一下什么是cda格式,cda是CD光盘和黑胶CD光盘等音乐光盘中的文件存储格式,将音频文件,如WAV波形文件使用“刻录成音乐CD”的方式写入光盘后,使用电脑打开这张光盘,你所看到的就是这种格式的文件。只有这种格式,你的CD播放机才能够支持。

如何将cda文件转换成mp3等其他音乐格式呢?我们需要借助编码转换软件,比较常用的有格式工厂,或者大家所熟悉的千千静听(现在已更名为网络音乐),格式工厂转换的目录非常简洁明了,我就不再细说。使用千千静听转换的时候,首先使用千千静听打开你要转换的音乐,可以拖动文件到列表,也可以通过菜单上的打开按钮,然后右键点击这个文件,选择转换格式,在输出格式里选择MP3,设置你想要的存储路径,然后点击立即转换即可。这里有一个可调的参数叫做比特率,比特率越高,音质损失越小,一般建议选择128到192,不建议选择128以下,会明显失真,如果选择过高,会导致文件过大。

这样你就可以转码成mp3文件了。

希望能够帮到你。

⑶ 怎样使用ffmpeg 进行音频解码

安装完成ffmpeg后,就可以使用ffmpeg进行音频文件格式转换。比如 ./ffmpeg -i /media/1.mp3 /media/1.wav, 通过该命令行可以将/media文件夹下1.mp3文件转换成WAV格式的。但是反过来 ./ffmpeg -i /media/1.WAV /media/1.MP3 却不能转换成Mp3格式,提示如下错误(找不到编码器):Stream mapping:Stream #0:0 -> #0:0 (wav -> ?)Encoder (codec none) not found for output stream #0:0如果强行指定编码器 ./ffmpeg -i /media/1.wav -acodec mp3 /media/1.mp3, 仍提示找不到编码器错误:Unknown encoder 'mp3'这是因为,ffmpeg虽然是个开源软件,但因为具体格式的版权原因,它并没有包含所有的编解码格式,或者有个格式只有对应的解码器,但没有编码器,比如 Mp3就只有解码器,能播放Mp3文件,但却没有Mp3的编码器,无法将其它格式转换成Mp3。可以通过命令行 ./ffmpeg -codecs 查询编解码配置,第一个D表示Decoder,该格式能够解码;E表示Encoder,该格式可以编码。从中可以看出Mp3不能编码,Mp2倒是即可解码 也可编码。如何解决这个问题呢? D A D mp1 MP1 (MPEG audio layer 1)D A D mp1float MP1 (MPEG audio layer 1)DEA D mp2 MP2 (MPEG audio layer 2)D A D mp2float MP2 (MPEG audio layer 2)D A D mp3 MP3 (MPEG audio layer 3)D A D mp3a ADU (Application Data Unit) MP3 (MPEG audio layer 3)D A D mp3afloat ADU (Application Data Unit) MP3 (MPEG audio layer 3)我的第一个方法是自己写代码来完成。源码文件中,Allcodecs.c中对各个格式进行注册,先修改Mp3的注册行,改为同时注册解码器和编码器:REGISTER_ENCDEC (MP2, mp2);REGISTER_DECODER (MP2FLOAT, mp2float);REGISTER_DECODER (MP3, mp3) // 此行修改为 REGISTER_ENCDEC (MP3, mp3)然后新增Mp3编码器的实现Struct,里面Init函数、encode函数、close函数使用Mp2的函数,因为我也不知道如何去实现Mp3的函数,或者说到代码实现级我也不知道Mp3和Mp2的区别在哪。AVCodec ff_mp3_encoder = {.name = "mp3",.type = AVMEDIA_TYPE_AUDIO,.id = CODEC_ID_MP3,.priv_data_size = sizeof(MpegAudioContext),.init = MPA_encode_init,.encode = MPA_encode_frame,.close = MPA_encode_close,.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},.supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0},.long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),.defaults = mp3_defaults,};重新编译上线。 用命令行./ffmpeg -i /media/1.WAV /media/1.MP3 试了一下,能成功生成1.mp3文件,文件也能播放。似乎没有问题了,单用 file /media/1.mp3 查看了一下,发现文件不是Mp3格式的,而是Mp2格式的:/media/1.mp3: MPEG ADTS, layer II, v1, 128 kbps, 44.1 kHz, Stereo很遗憾,自行修改代码的方式行不通,因为不是每个编解码格式协议的专家,自行修改代码失败的风险很大,不仅是Mp3,还有一些其他格式比如AMR OGG H.263是没有编码器的。所以,第二个方案,使用成熟的第三方编码器和ffmpeg结合。Mp3比较好的开源第三方库是libmp3lame(简称Lame)。我下了一个最新版本(3.99.4)的Lame源码,编译它:首先配置: ./configure –prefix=/shared –enable-shared –enable-static然后编译: makemake install生成文件: 动态链接库 /shared/lib/libmp3lame.so 和 静态链接库 /shared/lib/libmp3lame.a。这里只需要使用动态链接库,将.so文件拷贝到/lib中,这个文件夹是动态链接库的默认搜索路径, 让ffmpeg运行时可以找到。然后对ffmpeg配置libmp3lame: ./configure –enable-libmp3lame重新编译ffmpeg,运行转化命令,看看效果如何。首先执行 ./ffmpeg -codecs 查看可用编解码的变化,可以看到多出了libmp3lame编码器,带E的:D V D lagarith Lagarith losslessEA libmp3lame libmp3lame MP3 (MPEG audio layer 3)EV ljpeg Lossless JPEGD V D loco LOCO然后执行 ./ffmpeg -i /media/1.WAV /media/1.MP3, 生成1.mp3,用File命令查看,确实是Mp3文件。/media/1.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo大功告成,问题解决。也可在命令行中指定编解码生成Mp3文件:./ffmpeg -i /media/1.WAV -acodec libmp3lame /media/1.MP3.

⑷ 如何转换音频文件的编码格式

格式工厂(Format Factory)是由上海格式工厂网络有限公司创立于2008年2月,是面向全球用户的互联网软件。

主打产品“格式工厂”发展以来,已经成为全球领先的视频图片等格式转换客户端。格式工厂致力于帮用户更好的解决文件使用问题,现拥有在音乐、视频、图片等领域庞大的忠实用户,在该软件行业内位于领先地位,并保持高速发展趋势。

所有类型视频转到MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、webm等,新版支持RMVB(rmvb需要安装Realplayer或相关的译码器)、xv(迅雷独有的文件格式)转换成其他格式。

所有类型音频转到MP3、WMA、FLAC、AAC、MMF、AMR、M4A、M4R、OGG、MP2、WAV等。

所有类型图片转到JPG、PNG、ICO、BMP、GIF、TIF、PCX、TGA等。

软件截图(27张)

支持移动设备:索尼(Sony)PSP、苹果(Apple)iPhone&iPod、爱国者(Aigo)、爱可视(Archos)、多普达(Dopod)、歌美(Gemei)、iRiver、LG、魅族(MeiZu)、微软(Microsoft)、摩托罗拉(Motorola)、纽曼(Newsmy)、诺基亚(Nokia)、昂达(Onda)、OPPO、RIM黑莓手机、蓝魔(Ramos)、三星(Samsung)、索爱(SonyEricsson)、台电(Teclast)、艾诺(ANIOL)和移动设备兼容格式MP4、3GP、AVI。

转换DVD到视频文件,转换音乐CD到音频文件。DVD/CD转到ISO/CSO,ISO与CSO互转源文件支持RMVB。

可设置文件输出配置(包括视频的屏幕大小,每秒帧数,比特率,视频编码;音频的采样率,比特率;字幕的字体与大小等)。

高级项中还有“视频合并”与查看“多媒体文件信息”。

转换过程中可修复某些损坏的视频。

媒体文件压缩。

可提供视频的裁剪。

转换图像档案支持缩放,旋转,数码水印等功能。

支持从DVD复制视频。

支持从CD复制音乐。

⑸ 音频基础

声音是一种由物体振动引发的物理现象,如小提琴的弦声等。物体的振动使其四周空气的压强产生变化,这种忽强忽弱变化以波的形式向四周传播,当被人耳所接收时,我们就听见了声音。

以扬声器为例子,扬声器发声时是振膜在振动。下图是放了块小纸片到振膜上,振膜的振动导致小纸片“跳起了街舞”。

振膜的振动会导致振膜旁边的空气振动,然后导致更大范围的空气跟着一起振动,最后耳朵旁边的空气也开始振动。

如果只关注单个空气分子,可以发现:它来回振动的轨迹,就是一个正弦或余弦函数的曲线图。

声音有振幅,振幅的主观感觉是声音的大小。声音的振幅大小取决于空气压力波距平均值(也称平衡态)的最大偏移量。

从平衡位置到最大位移位置之间的距离,叫做 振幅 (Amplitude)。

空气分子完全来回振动一次所花费的时间,叫做 周期 (Period),单位是秒(s)。

物体每秒来回振动的次数,叫做 频率 (Frequency),也就是周期分之一。

理论上, 人类的发声频率是85Hz ~ 1100Hz ,人类只 能听见20Hz ~ 20000Hz 之间的声音。

PCM(Pulse Code Molation),脉冲编码调制。人耳听到的是模拟信号,PCM是把声音从模拟信号转化为数字信号的技术。

如何把声音(声源的振动)记录下来呢?声音属于模拟信号,但更便于计算机处理和存储的是数字信号(二进制编码),所以需要将 模拟信号 (Analog Signal)转成 数字信号 (Digital Signal)后进行存储。这一过程,我们可以称之为:音频数字化。

将音频数字化的常见技术方案是 脉冲编码调制 ( PCM ,Pulse Code Molation),主要过程是:采样 → 量化 → 编码。

模拟信号的波形是无限光滑的,可以看成由无数个点组成,由于存储空间是相对有限的,数字编码过程中,必须要对波形的点进行采样。 采样 (Sampling):每隔一段时间采集一次模拟信号的样本,是一个在时间上将模拟信号离散化(把连续信号转换成离散信号)的过程。

每秒采集的样本数量,称为 采样率 (采样频率,采样速率,Sampling Rate)。比如,采样率44.1kHz表示1秒钟采集44100个样本。

根据 采样定理 (奈奎斯特–香农采样定理,Nyquist-Shannon sampling theorem)得知:只有当采样率高于声音信号最高频率的 2 倍时,才能把采集的声音信号唯一地还原成原来的声音。人耳能够感觉到的最高声音频率为20000Hz,因此为了满足人耳的听觉要求,需要至少每秒进行40000次采样(40kHz采样率)。这就是为什么常见的CD的采样率为44.1kHz。电话、无线对讲机、无线麦克风等的采样率是8kHZ。

量化 (Quantization):将每一个采样点的样本值数字化。

位深度 (采样精度,采样大小,Bit Depth):使用多少个二进制位来存储一个采样点的样本值。位深度越高,表示的振幅越精确。常见的CD采用16bit的位深度,能表示65536(2 16 )个不同的值。DVD使用24bit的位深度,大多数电话设备使用8bit的位深度。

编码 :将采样和量化后的数字数据转成二进制码流。

单声道产生一组声波数据,双声道(立体声)产生两组声波数据。

采样率44.1kHZ、位深度16bit的1分钟立体声PCM数据有多大?

1分钟10.34MB,这对于大部分用户来说是不能接受的。要想在不改变音频时长的前提下,降低音频数据的大小,只有2种方法:降低采样指标、压缩。降低采样指标是不可取的,会导致音频质量下降,用户体验变差,因此专家们研发了各种压缩方案。

比特率 (Bit Rate),指单位时间内传输或处理的比特数量,单位是:比特每秒(bit/s或bps),还有:千比特每秒(Kbit/s或Kbps)、兆比特每秒(Mbit/s或Mbps)、吉比特每秒(Gbit/s或Gbps)、太比特每秒(Tbit/s或Tbps)。

采样率44.1kHZ、位深度16bit的立体声PCM数据的比特率是多少?

通常,采样率、位深度越高,数字化音频的质量就越好。从比特率的计算公式可以看得出来:比特率越高,数字化音频的质量就越好。

需要注意的是: 音频文件格式并不等于音频编码 。比如:

下面对常见的音频编码和文件格式做一个简介,以后有需要时再进行详细介绍。

WAV(Waveform Audio File Format),是由IBM和Microsoft开发的音频文件格式,扩展名是 .wav ,通常采用PCM编码,常用于Windows系统中。

WAV的文件格式 如下图所示,前面有44个字节的文件头,紧跟在后面的就是音频数据(比如PCM数据)。

根据采样率和位深度可以得知:相对于自然界的信号,音频编码最多只能做到无限接近,任何数字音频编码方案都是有损的,因为无法完全还原。目前能够达到最高保真水平的就是PCM编码,因此,PCM约定俗成叫做 无损 音频编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及常见的 WAV 文件中均有应用。

但并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。我们习惯性的把MP3列入 有损 音频编码范畴,是相对于PCM编码的。要做到真正的无损是困难的,就像用数字去表达圆周率,不管精度多高,也只是无限接近,而不是真正等于圆周率的值。

⑹ 怎么把音乐转换成mp3格式

工具/原料:

联想g480、win10、音频转换器2.0、音乐。

1、打开音频转换器,如下图所示:

⑺ 图片声音视频文件的编码是怎样的,请给出二进制流的逆转过程

先分开给您介绍一下视频编码跟音频编码:视频编码就是通过特定的压缩技术,将某个视频格式的文件转换成另外一种视频格式文件的方法。视频编码的主要功能是完成图像的压缩,使数字电视信号的传输量由1Gbit/s(针对1920×1080显示格式)减少为20-30Mbit/s。自然界中的声音以及波形都非常复杂,声音其实也是一种能量波,它有频率和振幅其中频率所对应的是时间轴线,振幅对应的是电平轴线。波是无限光滑的,弦线可看成由无数点组成。音频编码主要是完成对声音信息的压缩。声音信号数字化后,信息量比模拟传输状态大很多,不能像模拟电视声音那样直接传输因而需要对声音多一道压缩编码工序,即为音频编码。音视频编码原理视频编码主要是对图像进行有效的压缩。原始视频图像数据中包含大量的冗余信息视频编码主要采取块运动估计和运动补偿技术有效的去除图像帧间冗余度,来压缩码率和带宽,实现信号有效传输的目的。我们需要通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字信号。抽样就是在时间上将模拟信号离散化。量化是用有限个幅度值近似原来连续变化的幅度值,把模拟信号的连续幅度变为有限数量的有一定间隔的离散值。编码就是按一定的规律把量化后的值用二进制数字表示,然后转换成二值或多值得数字信号流。通常我们采用PCM编码,其主要过程是将话音、图像等模拟信号每隔一段时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,并将抽样值按一组二进制码来表示抽样脉冲的幅值。

⑻ 如何将MP3格式的文件转换为WAV格式 5种方法来将MP3格式的文件转换为WAV格式

目录方法1:免费的在线文件转换1、在网络上搜索在线转换器。2、导航到该网站内提供格式转换服务的部分。3、导入你想要转换的MP3文件。4、选择“以wav作为输出模式”。5、如果需要的话,输入你的电子邮箱地址来接收格式转换后的文件。6、点击转换按钮。方法2:iTunes1、打开iTunes。2、前往iTunes → 偏好设置 → 导入设置。3、将“导入使用”设置为“WAV编码器”。4、设置偏好参数。5、点击“确定”来关闭导入设置窗口。6、点击“确定”关闭通用参数选择窗口。7、选择iTunes中一个或多个MP3格式的文件。8、创建“wav版本的文件”。方法3:Windows媒体播放器1、确保你的Windows媒体播放器(WMP)配备有影音编码包。2、确保WMP里装备有AAC directhosw过滤器。3、首先使用WMP的剥离功能。4、双击“选项”对话框。5、点击“剥离音乐”标签。6、点击“Windows媒体音频格式”菜单框,选择“wav格式”。7、插入空白CD。8、开始剥离音乐。方法4:Audacity1、打开Audacity软件。2、前往文件 → 打开。3、选择你想要转换的MP3文件,然后点击打开。4、等待文件导入过程结束。5、前往文件 → 导出wav格式文件(Export as .wav.)。6、在“另存为.wav文件到”对话框中,选择转换后文件的保存路径。7、点击保存,然后程序将把MP3格式文件导出为wav格式。方法5:Sound Converter1、该程序仅兼容于Ubuntu和OSX操作系统,不适用于Windows系统。2、下载并安装软件。3、当你打开sound converter后,将MP3文件拖拽到“音频中心”的窗口中。4、点击编辑 → 偏好设置。5、选择“转换为wav格式”,然后点击“转换”。你是否想使用各种声频软件将你的MP3文件转换为WAV格式?本文将向你展示多种文件格式转换的方法。一起来学习吧。方法1:免费的在线文件转换1、在网络上搜索在线转换器。在著名的搜索引擎栏里输入“MP3转WAV格式转换器”。 然后优先搜索免费的网站。2、导航到该网站内提供格式转换服务的部分。有时候,你需要先访问该网页,然后再自行查找格式转换服务。3、导入你想要转换的MP3文件。4、选择“以wav作为输出模式”。有些网站会需要你指定文件转换的具体格式。5、如果需要的话,输入你的电子邮箱地址来接收格式转换后的文件。有些网站允许你自行从网站下载格式转换后的文件。有些网站则需要你提供一个电子邮箱来接收文件。如果你担心被垃圾、广告邮件骚扰,那么你可以使用一个你不常用的邮箱来接收文件。你可以使用这个邮箱专门来接收各种你需要的文件。6、点击转换按钮。下载转换好的文件,或通过电子邮箱接收文件。方法2:iTunes1、打开iTunes。根据你iTunes版本的不同,转换文件格式的操作会稍有不同。2、前往iTunes → 偏好设置 → 导入设置。如果你使用的是iTunes 7或更早版本的iTunes,那么你需要点击偏好设置里的“高级”选项卡后,才能进入“导入设置”。如果你使用的是iTunes 8或更新版本,那么进入“偏好设置”后,页面将自动进入“高级”选项下。3、将“导入使用”设置为“WAV编码器”。4、设置偏好参数。在“设置”旁边的选项里,选择“自动”或“自定义…”来设置参数 。如果你想要自定义文件转换的各项参数,那么点击“自定义…”,然后选择样本频率、样本大小以及声道。一般情况下,将声道设置为“立体声”即可。5、点击“确定”来关闭导入设置窗口。6、点击“确定”关闭通用参数选择窗口。7、选择iTunes中一个或多个MP3格式的文件。8、创建“wav版本的文件”。该步的具体操作取决于你的iTunes版本:选中文件后,进入“高级”选项卡,然后选择“创建WAV版本文件”。右键单击文件,然后选择“创建WAV版本”。方法3:Windows媒体播放器1、确保你的Windows媒体播放器(WMP)配备有影音编码包。影音编码包能够使WMP编码和解码音频播放文件,也能允许媒体播放器创建多个格式的音频文件。在网络上搜索“WMP编码包”,然后下载一个安全好用的编码包。下载后,编码包会自动整合到媒体播放器中。2、确保WMP里装备有AAC directhosw过滤器。AAC directshow过滤器是一个解密程序,能够允许WMP正常播放ACC格式的歌曲(iTunes中许多歌曲都是ACC格式)。在网络上搜索并下载安全可用的“AAC directshow过滤器”,并按照说明正确安装它。下载后,过滤器会自动整合到媒体播放器中。3、首先使用WMP的剥离功能。你可以将CD上的音频文件拷贝到电脑硬盘上,WMP就可以将MP3文件转化为WMV文件。4、双击“选项”对话框。点击现在播放 → 更多选项。5、点击“剥离音乐”标签。6、点击“Windows媒体音频格式”菜单框,选择“wav格式”。点击“应用”,然后点击“确定”,退出“选项”对话框。7、插入空白CD。8、开始剥离音乐。在菜单栏中,找到“剥离”标签,然后点击“剥离”,开始复制音乐。你的歌曲文件格式转换完后,就会自动添加到WMP的媒体库中。方法4:Audacity1、打开Audacity软件。你可以从官网下载软件。2、前往文件 → 打开。3、选择你想要转换的MP3文件,然后点击打开。4、等待文件导入过程结束。具体等待时间将取决于你的文件大小以及电脑运行速度。5、前往文件 → 导出wav格式文件(Export as .wav.)。6、在“另存为.wav文件到”对话框中,选择转换后文件的保存路径。如果你想要重命名wav文件,就在文件名一栏输入文件的名称。7、点击保存,然后程序将把MP3格式文件导出为wav格式。等待格式转换过程的完成。完成后,你就可以在你选择的路径下找到转换后的文件啦。方法5:Sound Converter1、该程序仅兼容于Ubuntu和OSX操作系统,不适用于Windows系统。所以如果你正使用Windows系统的电脑,那么你最好参考上面几种方法来转换文件格式,或者你可以考虑下载一个类似的音频转换器。2、下载并安装软件。如果你使用的是Ubuntu系统,那么你需要:前往主菜单 → 应用程序 → Ubuntu软件中心。在搜索栏内输入“soundc”,然后按下回车键。输入你的密码来验证身份。3、当你打开sound converter后,将MP3文件拖拽到“音频中心”的窗口中。4、点击编辑 → 偏好设置。5、选择“转换为wav格式”,然后点击“转换”。小提示当你使用网络在线转换服务时,务必先阅读网站给出的条款和协议,了解上传文件的时间、大小限制等情况。警告使用在线转换器存在一定的风险,在使用前最好自行把握风险。

⑼ 易语言音频转换取编码信息的方法

易语言音频转换取编码信息的方法是转换成url_utf8编码。将编辑框内文字转换成url_utf8编码,拼接成URL,通过http读文件方式,读取转换后的音频文件。并把它写成MP3文件。

⑽ 第六章 音视频的采集与编码

iOS平台提供了多套API采集音频,如果开发者想要直接指定一个路径,则可以将录制的音频编码到文件中,可以使用 AVAudioRecorder 这套API。

iOS平台提供了两个层次的API来协助实现,第一种方式是使用 AudioQueue ,第二种方式是使用 AudioUnit ,实际上AudioQueue是AudioUnit更高级的封装。

使用场景 1. AVAudioRecorder 简单易用 2. AudioQueue 仅仅是要获取内存中的录音数据,然后再进行编码输出(有可能是输出到本地磁盘,也有可能 是网络) 3. AudioUnit 要使用更多的音效处理,以及实时的监听。

ExtAudioFile ,iOS提供的这个API只需要设置好输入格式、输出格式以及输出文件路径和文件格式即可。

视频画面的采集主要是使用各个平台提供的 摄像头API 来实现的, 在为摄像头设置了合适的参数之后,将摄像头实时采集的视频帧渲染到屏幕上提供给用户预览,然后将该视频帧 编码 到一个视频文件中,其使用的编码格式一般是 H264 。

本节会设计并实现一个基于摄像头采集,最终用 OpenGL ES 渲染到 UIView 上,并且可以支持后期视频特效处理,以及编码视频帧的架构。

首先来看一下整体架构图

接下来分析一下该架构

我们就可以 抽象出以下两个规则。

基于上面的分析,我们可以画出节点的类图关系

由于我们要获取摄像头采集的数据,所以这里需重写该Protocol里面约定的方法,也就是摄像头用来输出数据的方法,签名如下:

最重要的是 CMSample-Buffer 类型的 sampleBuffer ,其中实际存储着摄像头采集到的图像, CMSampleBuffer 结构体由以下三个部分组成。

iOS平台不允许App进入 后台 的时候还进行 OpenGL 的渲染操作,如果App依然进行 渲染操作 的话,那么系统就会强制杀掉该App。

在iOS平台上的 CoreVideo 这个 framework 中提供了 方法,可以使得整个交换过程更加高效,因为 CVPixelBuffer 是 YUV 数据格式的,所以可以分配以下两个纹理对象。

为什么非要转换为RGBA格式呢?

因为在 OpenGL 中纹理的默认格式都是 RGBA 格式的,并且也要为后续的纹理处理以及渲染到屏幕上打下基础,最终编码器也是以 RGBA 格式为基础进行转换和处理的。

YUV转RGBA 在 FragmentShader 中将 YUV 转换为 RGBA 格式。

无论是单独的音频编码,还是视频编码中的音频流部分,使用得最广泛的都是 AAC 的编码格式。

首先是比特率,也就是最终编码出来的文件的码率,接着是声道 数、采样率,这两个将不再赘述,然后是最终编码的文件路径,最后是编码器的名字。

销毁前面所分配的资源以及打开的连接通道。

可使用 AudioToolbox 下的 Audio Converter Services 来完成硬件编码。

AudioToolbox 中编码出来的AAC数据也是裸数据,在写入文件之前 也需要添加上 ADTS 头信息,最终写出来的文件才可以被系统播放器播放。

类似于软件编码提供的三个接口方法,这里也提供了三个接口方法,分别用于完成 初始化 、 编码数据 和 销毁编码器 的操作。

iOS平台提供了音视频的API,如果需要用到硬件Device相关的API,就需要配置各种 Session ;如果要用到与提供的软件相关的API,就需要配置各种 Description 以描述配置的信息,而在这里需要配置的Description就是前面介绍的AudioUnit部分所配置的 Description 。

软件编码实际使用的库是 libx264 库,但是开发是基于FFmpeg的API进行的。

而编码的输入就是本文前面摄像头捕捉的纹理图像(显存中的表示),输出是 H264 的 Annexb 封装格式的流。

由于输入是一张 纹理 ,输出是 H264 的裸流。

VideoEncoderAdapter 。为一个类命名其实就是根据该类的职责而确定的,上面这个类实际上就是将输入的 纹理ID 做一个转换,使得转换之后的数据可以作为具体 编码器 的输入。

从全局来看一下软件编码器的整体结 构,如下图所示。

从上图中可以看到整个软件编码器模块的整体结构,其实, 纹理拷贝线程 是一个生产者,它生产的视频帧会放入 VideoFrameQueue 中; 而 编码线程 则是一个消费者,其可从 VideoFrameQueue 中取出视频帧, 再进行 编码 ,编码好的 H264 数据将输出到目标文件中。

Video-FrameQueue ,这是一个我们自己实现的 保证线程安全 的队列,实际上就是一个 链表 ,链表中每个 Node 节点内部的元素均是一个 VideoFrame 的结构体。

编码线程 ,在编码线程中首先需要实例化编码器,然后进入一个循环,不断从 VideoFrameQueue 里面取出视频帧元素,调用编码器进行编码,如果从 VideoFrameQueue 中获取元素的返回值是 -1 ,则跳出循环,最后销毁编码器。

纹理拷贝线程 ,该线程首先需要初始化OpenGL ES的上下文环境,然后 绑定到新建立的这个纹理拷贝线程之上。

帧缓存对象 是任何一个 OpenGL Program 渲染的目标。

在iOS8.0以后,系统提供了 VideoToolbox 编码API,该API可以充分 使用硬件来做编码工作以提升性能和编码速度。

首先来介绍 VideoToolbox 如何将一帧视频帧数据编码为 H264 的压缩数据,并把它封装到 H264HWEncoderImpl 类中,然后再将封装好的这个类集成进前面的预览系统中,集成进去之后,对于原来仅仅是预览的项目,也可以将其保存到一个 H264 文件中了。

使用 VideoToolbox 可以为系统带来以下几个优点,

而VideoToolbox是iOS 8.0 以后才公开的API,既可以做编码又可以做解码工作。

VideoToolbox的编码原理如下图所示

左边的三帧视频帧是发送给编码器之前的数据,开发者必须将原始图像数据封装为 CVPixelBuffer 的数据结构,该数据结构是使用 VideoToolbox 编解码的核心。

iOS的 CoreVideo 这个 framework 提供的方法 就是专门用来将 纹理对象 关联到 CVPixelBuffer 表示视频帧的方法。

下面来看这个编码器输出的对象, Camera 预览返回的 CMSampleBuffer 中存储的数据是一个 CVPixelBuffer ,而经过 VideoToolbox 编码输出的 CMSampleBuffer 中存储的数据是一个 CMBlockBuffer 的引用,如下图所示。

如何构建编码器,使用 Camera 的时候使用的是 AVCaptureSession ,而这里使用的会话就是 VTCompressionSession ,这个会话就代表要 使用编码器 ,等后续讲到 硬件解码场景 时将要使用的会话就是 VTDecompressionSessionRef 。

为什么要判断关键帧呢?因为 VideoToolbox 编码器在每一个关键帧前面都会输出 SPS 和 PPS 信息,所以如果本帧是关键帧,则取出对应的 SPS 和 PPS 信息。

那么如何取出对应的SPS和PPS信息呢?前面提到 CMSampleBuffer 中有一个成员是 CMVideoFormatDesc ,而 SPS 和 PPS 信息就存在于这个对于视频格式的描述里面。

Video-Encoder 也是一个输出节点,该输出节点是编码并写到磁盘中的。

有两点需要注意。 第一点,由于要将纹理对象渲染之后再放到编码器中。 第二点,由于渲染到的目标纹理对象需要交给编码器进行编码。

如上图所示,iOS平台提供的多媒体接口是从底层到上层的结 构,之前都是直接使用 VideoToolbox ,而 AVFoundation 是基于 VideoToolbox 进行的封装。它们的关注点不一样。

重点来看一下 AVFoundation 这个层次提供的几个主要API。

为了写入本地文件而提供的API,该类可 以方便地将图像和音频写成一个完整的本地视频文件。

该类可以 方便地将本地文件中的音频和视频解码出来。

这个类的使用场景比较多,比如拼接视频、合并音频与视频、转换格式,以及压缩视频等多种场景,其实是一个更高层次的封装。

项目链接地址如下:

iOS-FDKAACEncoder iOS-AudioToolboxEncoder Android-CameraPreview iOS-VideoToolboxEncoder


赞 (0)