short: Я пытаюсь просто воспроизвести звуковой файл, преобразованный с помощью ffmpeg, в моем приложении для Android, но у меня возникают проблемы с его работой.
long: у нас есть приложение для iphone и приложение для Android, которые делают одно и то же, и мне нужно перенести функцию воспроизведения звука на взаимодействие с пользователем.У меня есть исходный файл в формате aiff
, и я пытался преобразовать его в mp3
для 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, сегодня построил ffmpeg с macports, уровень Android-API равен 7 (Google API, 2.1-обновление1).просмотр таблицы «поддерживаемых форматов» на dev.android не показал, что мой файл не соответствует спецификации, но я могу ошибаться в этом.
у меня нетмалейшая подсказка относительно битрейта и так далее, так может кто-нибудь указать мне правильную комбинацию параметров ffmpeg, чтобы получить рабочий mp3 для Android?мне все равно, будет ли полученный файл mp3, ogg или 3gp или что-то еще.