2011-11-29 79 views
0

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或其他。

回答

1

也許不是你在找什麼,但對於音頻工作,你可能會有更好的運氣SoX。它就像ffmpeg就像音頻一樣。儘管在我眼中,你用ffmpeg所做的工作應該是有效的。

+0

感謝您的建議。我會看看它! – stefs

相關問題