简称:我想在我的android应用中简单地播放用ffmpeg转换的声音文件,但是碰巧无法正常工作。

长:我们有一个iPhone应用程序和一个android应用程序在做同样的事情,并且我必须移植在用户交互上播放声音的功能。我有aiff格式的源文件,并尝试将其转换为android的mp3。但是当应用尝试加载文件时,该应用始终崩溃

AssetFileDescriptor fileDescriptor = context.getResources().openRawResourceFd(resid);
final MediaPlayer mp = new MediaPlayer();
mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
fileDescriptor.close();
mp.prepare();

更具体地说,mp.setDataSource崩溃。一些挖掘使我相信编码有问题。声音文件本身位于res / raw中。
11-29 17:11:48.012: ERROR/SoundManager(15580): java.io.IOException: setDataSourceFD failed.: status=0x80000000
11-29 17:11:48.012: ERROR/SoundManager(15580):     at android.media.MediaPlayer.setDataSource(Native Method)
...

我试过的
  • 使用不同的mp3,该mp3已在不同的地方使用相同的代码。这可行。
  • 将其转换为wav文件。这并没有导致应用程序崩溃,但没有播放声音。那可能是另一个问题。
  • 将其转换为ogg;坠毁的

  • 因此,ffmpeg转换参数如下:
    $ ffmpeg -i click_24db.aif -f mp3 ~/foobar/wheel_click.mp3
    ffmpeg version 0.7.8, Copyright (c) 2000-2011 the FFmpeg developers
      built on Nov 24 2011 14:31:00 with gcc 4.2.1 (Apple Inc. build 5666) (dot 3)
      configuration: --prefix=/opt/local --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libopenjpeg --enable-libxvid --enable-libx264 --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64 --enable-yasm
      libavutil    50. 43. 0 / 50. 43. 0
      libavcodec   52.123. 0 / 52.123. 0
      libavformat  52.111. 0 / 52.111. 0
      libavdevice  52.  5. 0 / 52.  5. 0
      libavfilter   1. 80. 0 /  1. 80. 0
      libswscale    0. 14. 1 /  0. 14. 1
      libpostproc  51.  2. 0 / 51.  2. 0
    Input #0, aiff, from 'click_24db.aif':
      Duration: 00:00:00.01, start: 0.000000, bitrate: 1570 kb/s
        Stream #0.0: Audio: pcm_s16be, 44100 Hz, 2 channels, s16, 1411 kb/s
    Output #0, mp3, to '/Users/xyz/foobar/wheel_click.mp3':
      Metadata:
        TSSE            : Lavf52.111.0
        Stream #0.0: Audio: libmp3lame, 44100 Hz, 2 channels, s16, 64 kb/s
    Stream mapping:
      Stream #0.0 -> #0.0
    Press [q] to stop, [?] for help
    size=       1kB time=00:00:00.05 bitrate=  92.9kbits/s
    video:0kB audio:0kB global headers:0kB muxing overhead 45.563549%
    

    生成的文件在iTunes中播放效果很好,在android.media.MediaPlayer中加载时无法在vlc中播放并崩溃(注意:我首先使用SoundPool库(同时带有mp3和ogg)对其进行了尝试,但是那也不起作用) 。

    我还尝试了以下参数,这些参数不起作用:
    ffmpeg -i inputfile.aif -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 outputfile.mp3
    

    我正在osx上工作,今天已经用macports构建了ffmpeg,android api级别是7(google api,2.1-update1)。查看dev.android上的“支持的格式”表并没有表明我的文件不符合规范,但是我可能会误认为。

    我没有关于比特率等的丝毫线索,所以有人可以向我指出ffmpeg参数的正确组合以获得适用于Android的mp3吗?我不在乎生成的文件是mp3,ogg还是3gp或其他任何文件。

    最佳答案

    也许不是您想要的东西,但是对于音频工作,您可能会喜欢SoX更好。有点像ffmpeg只是为了音频。虽然在我看来,您对ffmpeg所做的工作应该是可行的。

    关于android - 使用ffmpeg转换声音文件以在Android应用中使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8314232/

    10-11 22:48
    查看更多