目录
一、背景
FFmpeg是一个强大数字媒体处理的工具,它支持几乎所有的视频和音频格式,并且可以进行高效的格式转换、编解码、录制以及流处理等一系列操作。在本文中,我们将详细探讨如何使用FFmpeg来处理音频编解码的任务,并通过讲解的方式深入了解其背后的原理和应用。本篇文章我们会从基础开始,逐步深入,来详细讲解FFmpeg音频编码。
二、音频编解码基础
音频编解码是指将音频信号转换为数字信号(编码),或者将数字信号还原为音频信号(解码)的过程。音频编码常用于压缩,以减少存储空间或传输带宽的需求。
1、音频编码
编码过程涉及采样、量化和编码三个步骤。采样是指按照一定的频率记录音频信号的过程,量化是将连续的采样值转换为有限个数的离散值,编码则是将量化后的值转换为二进制形式。
2、音频解码
解码过程则是编码的逆过程,它包括解码、反量化和重建三个步骤,最终将数字信号还原为可以播放的音频信号。
3、FFmpeg中的音频编解码处理
在FFmpeg中,音频编解码是通过调用不同的编解码器来完成的。每种音频格式都有相应的编解码器。例如,MP3格式的编解码器是libmp3lame,AAC格式的编解码器是libfdk_aac。
最新ffmpeg 库的sample_fmt必须以AV_SAMPLE_FMT_FLTP这种方式进行存储,AV_SAMPLE_FMT_FLTP是以浮点数的方式存储,后者是以有符号整形16位存贮的。如果是双声道的话二者的区别就比较大了。
AV_SAMPLE_FMT_S16的存贮方式如下图:
AV_SAMPLE_FMT_FLTP的存储方式如下图:
每个声道的 sample 数为:
frame->nb_samples
也就是每一个 data[n] 所有的 sample 的数,所以,字节数 = frame->nb_samples * per_sample_byte_size;
音频获取位宽:
int sample_bytes = av_get_bytes_per_sample(pCodecCtx->sample_fmt);
三、 FFmpeg命令行工具
FFmpeg的命令行工具是它的主要接口,它允许用户执行各种转换任务。以下是一些基本的命令行选项,用于音频编解码:
-i: 指定输入文件。
-codec:a 或 -c:a: 指定音频编解码器。
-b:a: 设置音频比特率。
-ar: 设置音频采样率。
-ac: 设置音频通道数。
-vn: 表示不处理视频。
四、示例
1、MP3编码
假设我们有一个未压缩的WAV音频文件,我们想要将它转换为MP3格式,以下是一个基本的转换命令:
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3
这个命令指定了输入文件input.wav
,输出文件output.mp3
,使用libmp3lame
作为编解码器,并设置了音频比特率为192kbps。
2、音频解码
如果我们想将MP3文件解码为WAV文件,可以使用:
ffmpeg -i input.mp3 output.wav
这条命令告诉FFmpeg将输入的MP3文件解码为WAV格式的输出文件。
3、FFmpeg音频过滤和效果处理
FFmpeg不仅限于编解码,它还有强大的音频过滤功能。通过libavfilter库,我们可以在编解码过程中添加各种音频效果。
例如,下面的命令会在转换为MP3的同时,将输入音频的音量提高:
ffmpeg -i input.wav -filter:a "volume=1.5" -codec:a libmp3lame output.mp3
这里-filter:a
指定了音频滤镜(volume),并设置了音量提高50%。
四、总结
FFmpeg是一个非常强大的工具,它可以处理几乎所有类型的音频编解码任务。通过对FFmpeg的了解和实践,你可以轻松地转换音频格式、调整音质、添加效果以及执行更复杂的音频处理任务。在音频编解码的核心是对输入信号的精确理解和对输出需求的控制,而FFmpeg提供了这一切所需的工具和选项。
五、参考文章
https://www.jianshu.com/p/0522ff4c36dd
http://javacv ffmpeg 编码和解码音频流和视频流 ffmpeg音频解码播放_mob64ca1401464d的技术博客_51CTO博客