使用ffmpeg转换声音文件以在android应用程序中使用

使用ffmpeg转换声音文件以在android应用程序中使用,android,audio,ffmpeg,mp3,Android,Audio,Ffmpeg,Mp3,short:我正试图在我的android应用程序中简单地播放一个用ffmpeg转换的声音文件,但在让它工作时遇到了问题 long:我们有一个iphone应用程序和一个android应用程序做同样的事情,我必须移植在用户交互中播放声音的功能。我有aiff格式的源文件,并尝试将其转换为android版的mp3。但当应用程序试图加载文件时,它会不断崩溃 AssetFileDescriptor fileDescriptor = context.getResources().openRawResource

short:我正试图在我的android应用程序中简单地播放一个用ffmpeg转换的声音文件,但在让它工作时遇到了问题

long:我们有一个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。这很有效
  • 将其转换为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中播放效果很好,在vlc中无法播放,并且在加载android.media.MediaPlayer时崩溃(注意:我第一次尝试使用SoundPool lib,同时使用mp3和ogg,但也不起作用)

我还尝试了以下参数,但无效:

ffmpeg -i inputfile.aif -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 outputfile.mp3
我现在正在开发osx,它是用macports构建的ffmpeg,android api级别是7(谷歌api,2.1-update1)。查看上的“支持的格式”表并没有表明我的文件不符合规范,但我可能弄错了


关于比特率等等,我一点也不知道,所以有谁能告诉我ffmpeg参数的正确组合,以便为android制作出一个正常工作的mp3吗?我不在乎生成的文件是否是mp3、ogg或3gp或其他任何文件。

也许不是您想要的,但对于音频工作,您可能会有更好的运气。它有点像ffmpeg,只用于音频。虽然在我看来,你用ffmpeg所做的应该是有效的