Проигрыватель Android не поддерживает MP3 с поддержкой PVMFErrNotSupported? - PullRequest
1 голос
/ 08 сентября 2010

У меня есть загруженный MP3, который я могу проверить в формате MP3 с помощью adb pull на мой Mac или ПК и воспроизвести в соответствующем медиаплеере.Однако ошибка от Android подразумевает, что он не поддерживает формат.Я думаю, что это может быть связано с расположением каталога, где я храню файл, но это не имеет смысла (/data/data/com.myapp/files/file_audio.mp3).Это код внутри AsyncTask:

    protected String doInBackground(String... params) {

        String filename = params[0];

        try {
            StringBuilder filenameMp3 = new StringBuilder().append(context.getFilesDir());
            filenameMp3.append("/").append(filename);

            Uri uriMp3 = Uri.parse(filenameMp3.toString());
            Log.d(TAG, "Listen to this ringtone! [" + uriMp3.toString() + "]");

            MediaPlayer mp = MediaPlayer.create(context, uriMp3);
            mp.prepare();
            mp.start();
        } catch (IllegalStateException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        } catch (IOException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }

        return null;
    }

Вот журнал:

09-07 23:16:09.617 E/MediaPlayerService( 1128): The Default Player is PV_PLAYER***********************
09-07 23:16:09.617 V/PVPlayer( 1128): PVPlayer constructor
09-07 23:16:09.617 V/PVPlayer( 1128): construct PlayerDriver
09-07 23:16:09.617 V/PlayerDriver( 1128): constructor
09-07 23:16:09.627 V/PlayerDriver( 1128): OpenCore hardware module loaded
09-07 23:16:09.627 V/PlayerDriver( 1128): start player thread
09-07 23:16:09.627 V/PlayerDriver( 1128): startPlayerThread
09-07 23:16:09.627 V/PlayerDriver( 1128): InitializeForThread
09-07 23:16:09.627 V/PlayerDriver( 1128): OMX_MasterInit
09-07 23:16:09.647 V/PlayerDriver( 1128): OsclScheduler::Init
09-07 23:16:09.647 V/PlayerDriver( 1128): CreatePlayer
09-07 23:16:09.657 V/PlayerDriver( 1128): AddToScheduler
09-07 23:16:09.657 V/PlayerDriver( 1128): PendForExec
09-07 23:16:09.657 V/PlayerDriver( 1128): OsclActiveScheduler::Current
09-07 23:16:09.657 V/PlayerDriver( 1128): StartScheduler
09-07 23:16:09.657 V/PVPlayer( 1128): send PLAYER_SETUP
09-07 23:16:09.667 V/PlayerDriver( 1128): Send player code: 2
09-07 23:16:09.667 V/PlayerDriver( 1128): CommandCompleted
09-07 23:16:09.667 V/PlayerDriver( 1128): Completed command PLAYER_SETUP status=PVMFSuccess
09-07 23:16:09.667 V/PVPlayer( 1128): setDataSource(/data/data/com.myapp/files/audio.mp3)
09-07 23:16:09.667 V/PVPlayer( 1128): prepareAsync
09-07 23:16:09.667 V/PVPlayer( 1128):   data source = /data/data/com.myapp/files/audio.mp3
09-07 23:16:09.667 V/PlayerDriver( 1128): Send player code: 3
09-07 23:16:09.667 V/PlayerDriver( 1128): handleSetDataSource
09-07 23:16:09.667 V/PlayerDriver( 1128): handleSetDataSource- scanning for extension
09-07 23:16:09.667 V/PlayerDriver( 1128): HandleInformationalEvent: PVMFInfoErrorHandlingStart
09-07 23:16:09.667 V/PlayerDriver( 1128): HandleInformationalEvent: type=26 UNHANDLED
09-07 23:16:09.667 W/MediaPlayer(14630): info/warning (1, 26)
09-07 23:16:09.667 I/MediaPlayer(14630): Info (1,26)
09-07 23:16:09.667 V/PlayerDriver( 1128): CommandCompleted
09-07 23:16:09.667 V/PlayerDriver( 1128): Completed command PLAYER_SET_DATA_SOURCE status=PVMFErrNotSupported
09-07 23:16:09.667 E/PlayerDriver( 1128): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
09-07 23:16:09.667 E/MediaPlayer(14630): error (1, -4)
09-07 23:16:09.677 V/PVPlayer( 1128): run_init s=-2147483648, cancelled=0
09-07 23:16:09.677 V/PlayerDriver( 1128): HandleInformationalEvent: PVMFInfoErrorHandlingComplete
09-07 23:16:09.677 W/PlayerDriver( 1128): PVMFInfoErrorHandlingComplete

Есть какие-нибудь подсказки?

Ответы [ 3 ]

2 голосов
/ 08 сентября 2010
FileInputStream fis = getBaseContext().openFileInput(filename.toString());
mp = new MediaPlayer();
mp.setOnCompletionListener(onCompleteAudioListener);
mp.setDataSource(fis.getFD());
mp.prepare();
mp.start();

Плюс обычная проверка и обработка ошибок.

0 голосов
/ 08 сентября 2010

ОК - я заставил это работать, но не так, как я надеялся, что смогу реализовать.Во-первых, мне пришлось хранить в системной папке мультимедиа:

File file = new File("/system/media/audio/ringtones/", filename);

Во-вторых, мне пришлось остановиться, подготовить, запустить медиаплеер.Я попробовал это, основываясь на других публикациях в Интернете.

            if (exists && length > 0) {
                mp = MediaPlayer.create(context, uriMp3);
                mp.stop();
                mp.prepare();
                mp.start();
            } else {
                if (exists) {
                    return String.format("Ringtone has length %d.", length);
                } else {
                    return String.format("Ringtone %s is missing.", uriMp3.toString());
                }
            }
0 голосов
/ 08 сентября 2010

Было бы хорошо проверить, существует ли файл, который вы хотите воспроизвести, и его длина больше 0, чтобы убедиться, что путь указан правильно:

File file = new File("/data/...../....mp3");

boolean exists = file.exists();

long length = file.length();

Также убедитесь, что ваш URI начинается с file://

...