基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译

3,445 阅读3分钟

Hello FFMPEG

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序

作为一名音频开发人员,最近在学习如何使用 FFMPEG 进行音频的编解码。网上大多数资料基于视频,在音频侧介绍较少,或者代码年代久远,已经跑不通了

摸索一段时间后,我掌握了如何利用 FFMPEG 进行音频编解码的正确姿势,在此博客中记录。各位看官如发现有错误的地方,请留言指出,感激不尽。

本文中,主要介绍如何安装 FFEMPG 以及运行如何正确调用 FFEMPG

安装

准确的说是安装 FFMPEG SDK

FFMPEG 除了一套 SDK 外,还包括一个可执行文件,利用它可以在不用编程的情况实现音视频的一些操作。举个例子,我们可以转换音频的格式:

ffmpeg -i input.mp3 output.wma

关于 FFMPEG 命令的使用,参考 官网文档-ffmpeg tool 或者这个 ffmpeg gist

作为开发人员,需要在我们的程序中利用 FFMPEG 进行音视频编解码等操作,这时候就要让 FFMPEG SDK 登场了。下面介绍如何在不同平台安装 FFMPEG。由于本人手头只有一台 Mac,无法验证 Linux 和 Windows 安装情况,这里只提供参考。

MacOS

brew install ffmpeg

Linux

Windows

Hello FFMPEG

编译过程推荐使用 cmake,方便我们引用 FFMPEG 的头文件、库等。

代码组织结构如下:

ffmpeg_audio_tutorial
├── 0_hello_ffmpeg.cpp
├── CMakeLists.txt
└── cmake
    └── FindFFMPEG.cmake

其中

  • CMakeLists.txt 根目录 cmake 文件
  • FindFFMPEG.cmake 为 find_package 准备的文件,让我们方便找到 FFMPEG 相关组件。这个文件我直接从其他地方 copy 的。原地址在这里
  • 0_hello_ffmpeg.cpp 源码文件

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(ffmepg_audio_tutorial)

list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

find_package(FFMPEG REQUIRED)
if(NOT FFMPEG_FOUND)
    message(ERROR "Cannot find ffmpeg")
else()
    message(STATUS "Found ffmpeg")
    message(STATUS "ffmpeg include dir is ${FFMPEG_INCLUDE_DIRS}")
    message(STATUS "ffmpeg libraries are ${FFMPEG_LIBRARIES}")
endif()


add_executable(hello_ffmpeg 0_hello_ffmpeg.cpp)
target_include_directories(hello_ffmpeg PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(hello_ffmpeg PRIVATE ${FFMPEG_LIBRARIES})

上述的 cmake 中:

  • 首先在 CMAKE_MODULE_PATH 添加搜索路径
  • find_package 去找到 ffmpeg 相关组件和头文件等信息

0_hello_ffmpeg.cpp


#if defined(__cplusplus)
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#if defined(__cplusplus)
}
#endif

#include <iostream>

using namespace std;

int main()
{
    cout << "avcodec_configuration : " << avcodec_configuration() << endl;
    return 0;
}

上述代码中:

  • 如果用的 C++ 编译,注意用 extern "C" 将 ffmpeg 头文件包起来
  • avcodec_configuration() 来显示 ffmpeg 构建信息

如果一切顺利,运行上面这个代码,你会得到类似的结果:

avcodec_configuration : --prefix=/usr/local/Cellar/ffmpeg/4.3.1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack

完整的代码已上传至 github,欢迎 star : github.com/jiemojiemo/…

总结

我们介绍了 FFMPEG 命令行和 FFMPEG 的区别,已经如何安装它们。接着,利用 cmake 去构建 hello ffmepg 程序,一切顺利的话,可以得到 FFMPEG 的构建信息。

转载请注明出处:juejin.cn/post/687145…

参考资料