0%

音视频系统入门常见问题

同学们在学习《音视频课小白系统入门》这门课的过程中,经常遇到一些问题,如Mac系统下为什么无法编译ffmpeg? Xcode编译课程中的程序为什么不成功? 为什么我从设备中读的数据很小?等等不足而一。

实际上,大部分同学提出的问题都是重复的。因此,我将一些最常见的问题整理出了答案放在这里,同学们可以根据自己的情况去查找相应的解决办法,以免我个人原因不能及时回答问题时,给大家的学习造成麻烦和不便。

Q: 遇到下面的问题该怎么办?

如果你的程序可以正常运行,这个错误可以忽略,这应该是Mac新版本引入的问题。

Q: 在 Mac 10.15.3 系统下编译 ffmpeg 成功后,在运行 ffmpeg 命令时出现crash.

A: 重新编译ffmpeg,在执行 ./configure 时增加 –extra-cflags=”fno-static-check” 选项,注意该选项一定要放在前面,否则编译有问题。

Q: 在Mac下添加 –extra-cflags=”fno-static-check” 选项仍然 crash

A: 编译时保持尽量少的参数,应该是与其它一些参数有突冲。

Q: 无论通过何种方式编译出的ffmpeg都会引发crash,如何解决?

A: 那就只能用命令的方式安装ffmpeg了,执行 brew install ffmpeg即可。

Q: 在Mac下,通过命令方式安装的ffmpeg没有带fdk-aac库怎么办?

A: 以命令方式安装带 fdk-aac 的ffmpeg需要按下面的步骤执行:

1
2
3
0. brew unstall ffmpeg
1. brew tap homebrew-ffmpeg/ffmpeg
2. brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-fdk-aac

注意,安装时如果报ERROR: libsnappy not found 错误,则你需要到https://github.com/google/snappy下载源码,并按照项目的说明编译并安装snappy库。

安装好snappy库后,重新执行brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-fdk-aac命令。

Q: 在Mac下通过命令方式安装ffmpeg库时,如何能带上其它第三方库呢?如x264

A: 与上面安装ffmpeg带fdk-aac库的命令是类似的,命令格式为: brew install ffmpeg --with-xxxx,添加某个库的具体参数可以通过homebrew-ffmpeg/ffmpeg/ffmpeg 来查找。

Q: Xcode 编译课程中的程序成功,但执行失败,报的错误是没有权限该如何解决?

A:

如果是上面这种错误信息,解决办法是: 在编译课程中的例子时,先将将沙盒关闭掉,在info.list中增加访问mic phone 访问权限。具体操作如下图所示:

Q: info.plist加了权限仍然报没有权限怎么解决?

A: 按下图操作试试

Q: 引入ffmpeg库后,报libavformat.xxx.dylib 未签名,错误信息类似”code signature…not valid”

A:

如果像上图所展示的一样,则按下面步骤操作:

    1. 打开 Mac 中的 keychain Access.app, 选择“我的证书”
    1. 执行 codesign -f -s “证书名” xxx.dylib
    1. 为了避免逐个签名,可以进行批量操作 codesign -f -s “证书名” /usr/local/ffmpeg/lib/*.dylib

Q: ffmpeg 执行时提示没有权限执行ffmpeg

A: 将目录切换到你自己的用户目录下再执行ffmpeg试试。

Q: 在Linux虚似机中每次获取的音频数据很小,只有64个字节,如果进行重采样?

A: ffmpeg中最低采样个数为32个,所以只有 64 字节数据时,是无进行重采样的。解决办法是将数据放到一个缓冲区中,积攒到一定大小后,再进行重采样。

Q: 在从设备采体音频数据时,返回错误 -35

A: 说明你的设备现在暂时还没准备好,此时你应该等待它几秒,之后就可以正常读数据了。例如:

1
2
3
4
5
6
7
while(re=av_read_frame(...)){
if(ret==-35) {
sleep(1);
continue;
}
...
}

Q: 在编码时,编码器返回 -35 错误

A: 此时说明编码器没有准备好,像上面的一样需要等待一会儿。

Q: 采集到的音频数据编码 AAC 时,报无法找到libfdk-aac库

A: 如果是通过命令安装的ffmepg,则上面已经给了答案。下面的方案是通过源码编译出带fdk-aac的ffmeg。具体步骤如下:

1
2
3
1. 安装好 fdk-aac库
2. 重新在ffmpeg源码目录下执行./configure 并增加--enable-libfdk-aac 参数
3. make && make install

Q: 在Linux中何采集音频数据

A: ffmpeg -f alsa -i hw:0,0 xxx.wav

Q: 在 Linux 中找不到 alsa 设备

A:可以通过 arecord -l 查看你linux系统下有哪些音频设备。如果没有alsa, 可以使用 oss.

Q: 编译ffmpeg 时 filter 编译不过

A:选择使用 libstdc++ 库试试

Q: Windows下编译ffmpeg

A: https://trac.ffmpeg.org/wiki/CompilationGuide/MinGW

Q: AAC 编码为 AAC_HE_V2 时,声音与原始声音不一样

A:这是因为老师用的 AAC 版本比较老,老版本的 AAC 与新版本的 AAC 可能有一些差异,这个我会后面查找一下原因。大家测试时可以将profile修改为 AAC HE 或 AAC LC,这样就可以正常编码出 AAC 数据了。

Q: 库已经安装好了,但仍报找不到它的错误?

A:首先确认是否已经将 pkg-config工具安装好了。可以执行下面的命令:

1
pkg-config

如果提示没有安装,则先将该工具安装好,安装命令如下:

  • ubuntu
    1
    apt intall pkg-config
  • mac
    1
    brew install pkg-config
  • cygwin
    1
    apt-cyg install pkg-config
  • centos
    1
    yum install pkg-config
    安装完该工具后仍然报错?那再按照具体的错误看下面的解决方案吧。

Q: libx264库找不到([ERROR: libx264 not found])

A:
该问题可能由下面三个方面的问题引起。

  • libx264库没有安装。对于这种情况有两种解决办法:
    • 其一,是通过平台的安装工作进行安装,如 apt/brew/yum install x264。(注:在Linux下应该安装 libx264-dev)。
    • 其二,是通过源码安装,步骤如下:
      1
      2
      3
      4
      5
      1. wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
      2. bunzip2 last_x264.tar.bz2
      3. tar -vxf last_x264.tar
      4. ./configure --enable-static --enable-shared --disable-asm --disable-avs
      5. make && sudo make install
  • 通过 pkg-config 命令无法找到。对于这类问题,我们可以使用下面的命 pkg-config --cflags --lib libx264看是否可以找到 libx264,如果找不到,就说明确实是这个问题。解决的办法是设置环境变量。
    1
    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/xxx/xxx/lib/pkgconfig
    其中 xxx 由你的实际路径代替。

注,有可能你的系统中并没有装 pkg-config工具,可以使用 brew/apt/yum install pkg-config进行安装。

  • 无法链接上libx264, 这是由于通过环境变量 LD_LIBRARY_PATH 无法定位到 libx264库。解决的办法也很简单,与上面类似,可以通过设置环境变量来解决该问题。
    1
    export LD_LIBRARY_PATH=$LIB_LIBRARY_PATH:/xxx/xxx/lib
    其中,xxx由你的实际路径代替。

当然,你也可以将环境变量设置在脚本里,这样就不用每次都写export命令了。只需要将上面的两条语句加入到 ~/.bashrc / 或~/.bash_profile 文件里,然后在控制台执行 source ~/.bashrcsource ~/.bash_profile即可。

Q: 通过 avcodec_find_encoder_by_name() 无法找到编码器

A:通过以下步骤进行解决

1
2
3
4
0. 你使用的ffmpeg必须是经过源码编译的
1. 你在编译 ffmpeg 时,执行./configure时是否将此编码器模块添加到 ffmpeg中了?以 fdk_aac 为例,在执行 ./configure …时你应该加上 --enable-libfdk-aac 选项。
2. 如果通过源码编译ffmpeg时有报错,请根据错误信息查看本文档的相应处理方法
3. 确保 pkg-config 命令查询到的是你通过源码编译的ffmpeg库

Q: 编译不出ffplay

A:引起该问题有以下几方面的原因:

  • 所使用的操作系统没有安装图形库。如有的同学在阿里的云服务器上想安装ffplay是肯定不行的。
  • 没有安装 SDL2 库。解决办法是通过 brew/apt/yum install sdl2 即可 或 通过 SDL2 源码安装。安装完成后,要重新进行到 ffmpeg目录下,执行 ./configure…这指命令。
  • 有的同学编译ffmpeg时,在ffmpeg目录执行./configure …时没有添加 –enable-sdl2 选项也会导致无法编译出 ffplay
  • SDL2与最新的Mac系统 mojave不兼容。解决办法:
    • 方法一
    • SDL下载 2.0.9版本或以后的SDL2代码。
    • 执行 ./configure
    • 执行 make && sudo make install
    • 执行 export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
    • [重新]编译ffmpeg
    • 方法二
    • SDL下载dmg包。
    • 执行 open SDL2-2.0.9.dmg
    • [重新]编译ffmpeg
  • 如果是ubuntu系统可以用下面的命令安装
    1
    apt install sdl2-dev

Q: 非Mac同学如何学习本课程

A:本课程中的例子的界面是由 Swift 编写的,如果你没有 Mac 系统的话,你可以用 Qt 甚至不用界面开发,代码中与ffmpeg相着的代码都是跨平台的。

参考

音视频小白系统入门课

欢迎关注我的其它发布渠道