本文目录

一、FFmpeg简介
二、FFmpeg常用参数
三、FFmpeg环境安装
四、常用音/视频格式转换命令
五、批量转换脚本
六、常识补充
七、其他

【点击➕关注】:小贾探AI
本人投身于软件行业近十载,专注于WEB工程落地、大数据领域、图谱领域以及AI领域(大模型-GPT-应用落地),平时会在公众号不定期发布一些技术类和实践类的文章,欢
迎关注,一起进步一起成长~

一、FFmpeg简介

FFmpeg是一个开源的跨平台音视频处理工具和多媒体框架。它可以用于处理音频、视频、字幕等多媒体数据,支持多种音视频格式的转码、编辑、解码、编码和流媒体传输等操作。FFmpeg是由Fabrice Bellard在2000年创建的,并由全球社区持续维护和改进。

应用场景:

  1. 视频转码:将视频从一种格式转换为另一种格式,例如将MP4转换为MKV或WebM。
  2. 音频转码:将音频从一种格式转换为另一种格式,例如将WAV转换为MP3或AAC。
  3. 视频剪辑和合并:对视频进行剪辑、裁剪和合并,实现视频编辑功能。
  4. 音频处理:调整音频的音量、混音、降噪等操作,用于音频编辑和处理。
  5. 视频处理:调整视频的分辨率、帧率、比特率,添加水印、滤镜等操作,用于视频编辑和处理。
  6. 视频流处理:将实时的音视频流传输到网络或服务器,用于实时视频直播和流媒体传输。
  7. 音频流处理:将实时的音频流传输到网络或服务器,用于实时音频直播和流媒体传输。
  8. 屏幕录制:通过FFmpeg可以实现对屏幕进行录制,并将录制的视频流保存为文件或实时传输到网络。

由于FFmpeg是一个功能强大且灵活的工具,它在各种应用中得到了广泛的应用,包括视频编辑、音频编辑、媒体转换、实时流媒体传输等领域。同时,它的开源性质使得开发者可以根据自己的需求进行二次开发和定制,使其适用于更广泛的应用场景。

二、FFmpeg常用参数

FFmpeg常用参数的取值枚举:

  1. 输入和输出参数:

    • -i input_file: 输入文件路径,常见的格式如video.mp4audio.wav等。
    • output_file: 输出文件路径,通常使用的格式如output.mp4output.mkv等。
  2. 媒体流处理参数:

    • -map: 输入流或输出流的映射,常用的取值如0:00:11:0等。
    • -vn: 禁用视频流,通常不需要取值。
    • -an: 禁用音频流,通常不需要取值。
    • -sn: 禁用字幕流,通常不需要取值。
  3. 视频参数:

    • -vcodec codec: 视频编解码器,常见的取值如h264libx265vp9等。
    • -r fps: 视频帧率,通常的取值如2530等。
    • -s size: 视频分辨率,常见的取值如1920x10801280x720等。
    • -b:v bitrate: 视频比特率,常见的取值如1000k2M等。
    • -c:v copy: 复制视频流,无需重新编码,通常不需要额外取值。
  4. 音频参数:

    • -acodec codec: 音频编解码器,常见的取值如aacmp3opus等。
    • -ar frequency: 音频采样率,常见的取值如4410048000等。
    • -ab bitrate: 音频比特率,常见的取值如128k256K等。
    • -ac channels: 音频通道数,通常的取值为1(单声道)或2(立体声)。
    • -c:a copy: 复制音频流,无需重新编码,通常不需要额外取值。
  5. 视频滤镜参数:

    • -vf filter_graph: 添加视频滤镜效果,常见的取值如scale=640:480用于调整视频大小。
  6. 音频滤镜参数:

    • -af filter_graph: 添加音频滤镜效果,常见的取值如volume=2.0用于增加音量。
  7. 格式参数:

    • -f format: 输出文件格式,常见的取值如mp4avimkv等。
  8. 其他参数:

    • -y: 覆盖输出文件而不询问,通常不需要额外取值。
    • -ss position: 从指定的时间位置开始处理输入文件,常见的取值如00:01:30表示从1分30秒处开始处理。
    • -t duration: 设置处理的时长,常见的取值如60表示处理60秒的内容。

请注意,具体的取值可能因使用场景和媒体文件的不同而有所变化,建议根据具体需要来选择合适的参数取值。同时,最好查阅最新的FFmpeg文档或使用ffmpeg -h命令来获取最准确的参数信息。

三、FFmpeg环境安装

安装FFmpeg环境可以在不同操作系统上完成。以下是在Windows、macOS和Linux上安装FFmpeg的常见方法:

  1. Windows环境安装:

    • 前往FFmpeg官方网站:https://ffmpeg.org/download.html
    • 在"Get the packages"部分,找到Windows下的"Static Builds"链接,进入下载页面。
    • 根据你的系统架构(32位或64位),下载对应的静态版本的FFmpeg二进制文件。
    • 解压下载的ZIP文件,并将其中的ffmpeg.exeffprobe.exe等可执行文件添加到系统的PATH环境变量中。
  2. macOS环境安装:

    • 使用Homebrew进行安装(推荐):
      打开终端,运行以下命令:
      brew install ffmpeg
      
    • 手动安装:
      前往FFmpeg官方网站下载macOS版的静态或动态版本,解压后将其中的可执行文件添加到PATH环境变量中。
  3. Linux环境安装:

    • 使用包管理器进行安装:
      对于Debian/Ubuntu系统,打开终端,运行以下命令:
      sudo apt-get install ffmpeg
      
      对于CentOS/Fedora系统,运行以下命令:
      sudo yum install ffmpeg
      
    • 编译安装:
      前往FFmpeg官方网站下载源码包,然后编译安装。

安装完成后,你可以在终端或命令行中直接运行ffmpeg命令来使用FFmpeg。请注意,不同系统上安装方法可能有所不同,建议根据你的操作系统选择合适的安装方式,并遵循官方文档或社区教程进行操作。

如果你想自己编译安装FFmpeg,可以按照以下步骤进行:

  1. 获取FFmpeg源码:
    前往FFmpeg官方网站(https://ffmpeg.org/download.html)下载最新的源码压缩包,或者使用Git从官方仓库获取源码。

  2. 安装编译依赖:
    在编译前,你需要安装一些编译依赖库。具体依赖库可能因操作系统而异,以下是一些常见操作系统的安装命令:

    • Debian/Ubuntu系统:

      sudo apt-get update
      sudo apt-get install build-essential
      
    • CentOS/Fedora系统:

      sudo yum groupinstall "Development Tools"
      
    • macOS系统:
      使用Homebrew安装依赖库:

      brew install automake autoconf libtool pkg-config
      
  3. 编译和安装:
    解压下载的源码包,进入解压后的目录,然后运行以下命令进行编译和安装:

    ./configure --prefix=/usr/local/ffmpeg
    make
    sudo make install
    

    上述命令将FFmpeg安装到/usr/local/ffmpeg目录下。你可以根据自己的需求调整--prefix参数来指定其他安装目录。

  4. 配置环境变量:
    安装完成后,将FFmpeg可执行文件的路径添加到系统的PATH环境变量中,这样你就可以在终端或命令行中直接运行ffmpeg命令。编辑你的.bashrc.zshrc或其他shell配置文件,添加类似以下的行:

    export PATH=/usr/local/ffmpeg/bin:$PATH
    

    然后重新加载配置文件或重新启动终端,使修改生效。

完成以上步骤后,你就成功编译安装了FFmpeg环境。自己编译安装可以让你更灵活地选择所需功能和版本,但也需要注意处理依赖库和编译过程中可能遇到的问题。如果你不太熟悉编译和系统环境配置,建议使用包管理器或预编译版本进行安装。

四、常用音/视频格式转换命令

以下是五种音频文件格式两两互相转换的命令:

  1. wav 转 mp3:

    ffmpeg -i input.wav -c:a libmp3lame output.mp3
    
  2. mp3 转 wav:

    ffmpeg -i input.mp3 -c:a pcm_s16le output.wav
    
  3. wav 转 pcm:

    ffmpeg -i input.wav -f s16le -acodec pcm_s16le output.pcm
    
  4. pcm 转 adpcm:

    ffmpeg -f s16le -i input.pcm -c:a adpcm_ima_wav output.adpcm
    
  5. wav 转 amr:

    ffmpeg -i input.wav -c:a amr_nb output.amr
    

这里的 -c:a 参数指定了音频编解码器,libmp3lame用于MP3,pcm_s16le用于无损PCM,adpcm_ima_wav用于ADPCM,amr_nb用于AMR-NB。同时,输出文件的扩展名可以决定输出的文件格式,例如.mp3代表MP3格式,.wav代表WAV格式,.pcm代表无损PCM格式,.adpcm代表ADPCM格式,.amr代表AMR格式。

**注意:**转换命令中的输入文件和输出文件路径需要根据实际文件名进行调整。另外,转换过程可能会导致音质损失,特别是从有损格式(如MP3)转换为无损格式(如WAV)。因此,建议根据具体需求慎重选择音频格式转换。

五、批量转换脚本

import os
import subprocess

def adpcm_to_wav(adpcm_file, wav_file):
    command = f'ffmpeg -i "{input_path}" -acodec pcm_s16le -ac 1 -ar 16000 "{output_path}" -y'
    subprocess.call(command, shell=True)

def mp3_to_wav(adpcm_file, wav_file):
    command = f'ffmpeg -i "{input_path}" -f wav "{output_path}"'
    subprocess.call(command, shell=True)

def adpcm_to_pcm(adpcm_file, pcm_file):
    # command = f'ffmpeg -i "{input_path}" -acodec pcm_s16le -ac 1 -ar 16000 "{output_path}" -y'
    # command = f'ffmpeg -i "{input_path}" -ac 1 -ar 16000 -ab 12.2k -y "{output_path}"'
    command = f'ffmpeg -i "{input_path}" -ac 1 -ar 16000 -f s16le "{output_path}"'
    subprocess.call(command, shell=True)


if __name__ == "__main__":
    adpcm_file_path = "amr"

    output_file_path = "wav"
    # output_file_path = "mp3"
    # output_file_path = "pcm"

    # 检查输出文件夹是否存在,如果不存在则创建
    if not os.path.exists(output_file_path):
        os.makedirs(output_file_path)

    counter = 0
    # 遍历输入文件夹中的所有文件
    for filename in os.listdir(adpcm_file_path):
        if filename.endswith('.amr'):
            input_path = os.path.join(adpcm_file_path, filename)
            output_path = os.path.join(output_file_path, os.path.splitext(filename)[0] + '.wav')

            # adpcm_to_wav(input_path, output_path)
            mp3_to_wav(input_path, output_path)
            # adpcm_to_mp3(input_path, output_path)
            # adpcm_to_pcm(input_path, output_path)

            counter += 1
            print(f'Converted {filename} to XXX format.')
            print(f'processed files: {counter}')

    print('Conversion completed.')
    print(f'Total files converted: {counter}')

六、常识补充

音频文件可以分为有损压缩格式和无损压缩格式。以下是常见的有损和无损音频文件格式:
  • 有损压缩格式:
  1. MP3 (MPEG Audio Layer III): 最常见的音频格式之一,可以实现较高的压缩比,但会损失一定音质。
  2. AAC (Advanced Audio Coding): 在音质上相对于MP3有一定优势,常用于音乐流媒体和移动设备。
  3. WMA (Windows Media Audio): 主要由Windows媒体播放器使用,相对MP3具有类似的压缩性能。
  4. OGG (Ogg Vorbis): 一种开源音频格式,提供较高的音质和压缩效率。
  5. AMR (Adaptive Multi-Rate): 主要用于移动电话,适合语音通信,压缩率较高。
  6. ADPCM是一种有损压缩音频格式,通过差分编码实现音频数据的压缩。
  • 无损压缩格式:
  1. FLAC (Free Lossless Audio Codec): 提供无损压缩,音质与原始音频文件完全一致,压缩比较高。
  2. ALAC (Apple Lossless Audio Codec): 苹果公司开发的无损音频格式,用于iTunes和苹果设备。
  3. WAV (Waveform Audio File Format): 无损格式,不进行任何压缩,保留了原始音频数据。
  4. AIFF (Audio Interchange File Format): 无损格式,常用于苹果设备和专业音频工作站。
  5. APE (Monkey’s Audio): 提供无损压缩,较高的压缩率,但不如FLAC流行。
  6. PCM是一种无损格式,适用于要求高保真音质的场景。

无损格式保留了原始音频数据,因此在质量上不会损失,但文件尺寸较大。而有损格式通过丢弃一部分音频信息来实现较高的压缩率,但在一定程度上会降低音质。根据实际需求,选择合适的音频格式很重要,例如对于音乐存档和专业音频工作,无损格式可能更合适;而对于普通用户和移动设备,常见的有损格式如MP3或AAC通常是更好的选择。

音频格式PCM和ADPCM的区别:
  1. PCM(Pulse Code Modulation):PCM是一种无损音频格式,它是数字音频的一种基本编码方式。在PCM格式中,音频信号被精确地采样和量化,并且不进行任何压缩,因此它完全保留了原始音频数据。PCM格式适用于需要高保真音质的场景,例如音乐制作、音频存档和专业音频处理。
  2. ADPCM(Adaptive Differential Pulse Code Modulation):ADPCM是一种有损压缩音频格式,通过差分编码实现音频数据的压缩。它使用差异值来表示音频样本之间的差异,从而减少了数据量。虽然ADPCM可以实现较高的压缩率,但在压缩的过程中会丢失部分音频信息,导致音质有损。ADPCM适用于对音质要求不高的场景,例如语音通话和一些低码率音频传输。

PCM是一种无损音频格式,完全保留原始音频数据,适用于高保真音质的场景;而ADPCM是一种有损压缩音频格式,通过差分编码实现较高的压缩率,但会损失一定的音质,适用于对音质要求不高的场景。

七、其他命令实践

【音频转换】
1.转换amr到mp3:
ffmpeg -i trans_wav_to.amr amr2mp3.mp3
2.转换amr到wav:
ffmpeg -i trans_wav_to.amr -ac 1 -ar 16000 -ab 12.2k -y trans_amr_to.wav
3.转换mp3到wav:
ffmpeg -i wav2mp3.mp3 -f wav test1.wav
4.转换wav到amr:
ffmpeg -i test.wav -acodec libopencore_amrnb -ab 256000 -ar 8000 -ac 1  trans_wav_to.amr
5.转换wav到mp3:
ffmpeg -i test.wav -f mp3 -acodec libmp3lame -y wav2mp3.mp3
6.pcm转为wav
ffmpeg -f f32le -acodec pcm_f32le -i test.pcm -ac 1 -ar 8000 -ab 256000 -y test.wav 

【视频转换】
1.转换wmv到mp4:
ffmpeg -i sample.wmv -vcodec libx264 -acodec aac out.mp4
2.抓取H264视频流:
ffmpeg -i sample.flv -vcodec copy -vbsf h264_mp4toannexb -an out.h264
2.1 vbsf为过滤方法,即将flv规定的H264组织方式转换回H264协议书规定的字节流格式  2.2 -an 禁掉源文件中的音频,因为出来的码流不需要音频  2.3 vcodec copy这个是必然的
3.将H264视频流转为mp4:
ffmpeg -i sample.h264 -f mp4 haha.mp4
4.接收rtsp并存为视频文件:
ffmpeg -rtsp_transport tcp -i rtsp://streaming1.osu.edu/media2/ufsap/ufsap.mov -vcodec copy -acodec copy -t 30 -f mp4 rtsp-out.mp4
4.1 -rtsp_transport tcp:指明传输方式是tcp方式(也可以是udp)
4.2 -t 30:指明我录制30秒
ffmpeg将音频或视频编码为AMR格式音频
Android编码的MP4音频格式可能为AMR,这时候用以下命令可以从MP4中直接提取AMR音频:
ffmpeg -i test.mp4 -c:a copy test.amr

【将其他格式的音频或视频转成AMR的命令】
新写法:ffmpeg -i test.mp4 -c:a libopencore_amrnb -ac 1 -ar 8000 -b:a 12.20k -y test.amr
旧写法:ffmpeg -i test.mp4 -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 12.20k -y test.amr

【点击➕关注】:小贾探AI
本人投身于软件行业近十载,专注于WEB工程落地、大数据领域、图谱领域以及AI领域(大模型-GPT-应用落地),平时会在公众号不定期发布一些技术类和实践类的文章,欢
迎关注,一起进步一起成长~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐