什么是用FFmpeg解码的原始PCM音频文件或mp3文件更快?

问题描述 投票:0回答:1

我对Android应用程序的开发非常深入,当我第二次处理音频文件以尝试使用更长的音频片段(1000毫秒长)时,我现在又遇到了音频故障。在我没有遇到160ms长的文件故障之前。

  • 背景:我正在制作一个节拍器,所以想象一下回调中大约有100行代码,不断找出要播放的音频文件以及播放多长时间。

没有进入我的代码,我只是想知道文件大小或文件类型是否对性能有影响?我相信我正在使用示例Player渲染类(source)(用于原始文件输入),该类似乎在每个回调中加载文件的音频数据。这是否可能会从较大的阵列加载数据会使速度变慢?虽然,这也可能是我要添加到回调中的新功能/逻辑。

我知道经常谈论使用mp3和使用FFmpeg进行解码。有没有人在mp3和raw之间做过基准测试,使用mp3是否有性能优势,还是主要是为了减少APK大小?

很抱歉,如果在某处进行了讨论,但是我找不到在这两种文件类型之间提及此方面的任何文章。仔细观察渲染类,我的直觉告诉我“不应该”考虑文件大小……否则,我将继续调试,并在可能的情况下获得一些系统跟踪信息。

android audio ffmpeg oboe
1个回答
0
投票

要使用@llogan的建议来回答,这里是一些使用ffmpeg命令行实用程序的基准测试:

mp3:

ffmpeg -benchmark -i sound.mp3  -f null -
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, mp3, from 'sound.mp3':
  Duration: 00:00:01.03, start: 0.023021, bitrate: 121 kb/s
    Stream #0:0: Audio: mp3, 48000 Hz, stereo, s16p, 121 kb/s
    Metadata:
      encoder         : LAME3.100
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
    Metadata:
      encoder         : Lavc57.107.100 pcm_s16le
size=N/A time=00:00:01.00 bitrate=N/A speed=83.6x    
video:0kB audio:188kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
bench: utime=0.008s
bench: maxrss=37292kB

原始:

ffmpeg -benchmark -f s16le -channels 2 -sample_rate 44100 -i sound.raw -f null -
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[s16le @ 0x56493de82c00] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, s16le, from 'sound.raw':
  Duration: 00:00:01.09, bitrate: 1411 kb/s
    Stream #0:0: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      encoder         : Lavc57.107.100 pcm_s16le
size=N/A time=00:00:01.08 bitrate=N/A speed= 819x    
video:0kB audio:188kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
bench: utime=0.001s
bench: maxrss=36752kB

通过这些结果,(如果我没看错的话)似乎.raw.mp3差了大约7ms。在内存消耗方面,.raw.mp3高1 MB。如果使用48000流速率进行解码,则.raw在内存消耗方面要比.mp3高2 MB。

使用此数据,似乎从技术上来说,使用Raw可能会更快,尽管mp3的优点是文件大小非常紧凑。因此,对于我来说,我的文件大小相对较小(190kB x 9个文件),这并不是一个很大的因素。话虽如此,在10毫秒之内加载声音文件并不可怕,我认为这不会影响您应用的性能。

© www.soinside.com 2019 - 2024. All rights reserved.