【问题标题】:Using ffmpeg to convert sound files for use in an android app使用 ffmpeg 转换声音文件以在 android 应用程序中使用
【发布时间】:2012-01-10 10:42:08
【问题描述】:

简短:我试图在我的 android 应用程序中简单地播放用 ffmpeg 转换的声音文件,但碰巧在让它工作时遇到问题。

long:我们有一个 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 中播放良好,在 vlc 中无法播放,并且在加载 android.media.MediaPlayer 时崩溃(注意:我首先使用 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 或其他文件。

【问题讨论】:

    标签: android audio ffmpeg mp3


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2011-03-16
      • 2011-03-07
      • 2022-01-06
      • 2013-08-27
      相关资源
      最近更新 更多