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

时间:2011-11-29 16:29:50

标签: android audio ffmpeg mp3

简短:我想在我的Android应用中简单地播放用ffmpeg转换的声音文件,但碰巧有问题让它发挥作用。

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

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中播放效果不佳,在使用android.media.MediaPlayer加载时无法在vlc中播放和崩溃(注意:我首先尝试使用SoundPool lib,同时使用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等等。

1 个答案:

答案 0 :(得分:1)

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