short:我試圖在我的android應用程序中簡單地播放使用ffmpeg轉換的聲音文件,但恰巧遇到了使其工作的問題。使用ffmpeg轉換聲音文件以便在Android應用程序中使用
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庫進行嘗試,同時使用了mp3和ogg,但那也不起作用)。
我也試過以下paramters,沒有工作:今天
ffmpeg -i inputfile.aif -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 outputfile.mp3
我工作在OSX上,內置的ffmpeg與MacPorts的,Android的API級別爲7(谷歌API,2.1 UPDATE1) 。查看dev.android上的「支持的格式」表並未指出我的文件不符合規範,但我可能會誤解。
我對比特率等方面沒有絲毫的線索,所以任何人都可以請我指出正確的ffmpeg參數組合來獲得一個工作的MP3爲Android?我不在乎如果生成的文件將是MP3,ogg或3gp或其他。
感謝您的建議。我會看看它! – stefs