Потоковое аудио AAC с Android - PullRequest
       85

Потоковое аудио AAC с Android

20 голосов
/ 30 октября 2009

Насколько я понимаю, Android будет воспроизводить аудио в формате AAC, только если он закодирован как MPEG-4 или 3GPP.

Я могу воспроизводить аудио AAC, закодированное как M4A, когда оно локально для приложения, но не получается при получении его с сервера.

Следующее работает, поскольку файл m4a хранится локально в каталоге res / raw.

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*);
mp.start();

Следующее не работает. (Но с MP3).

Uri uri = Uri.parse("http://*example.com*/blah.m4a");
MediaPlayer mp = MediaPlayer.create(this, uri);
mp.start();

Может кто-нибудь пролить свет на причины сбоя, когда аудиофайл m4a не является локальным?

Вот (некоторые из) ошибка ...

ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus
ERROR/MediaPlayer(769): error (200, -32)  
WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete  
DEBUG/MediaPlayer(769): create failed:  
DEBUG/MediaPlayer(769): java.io.IOException: Prepare failed.: status=0xC8  
DEBUG/MediaPlayer(769):     at android.media.MediaPlayer.prepare(Native Method)  
DEBUG/MediaPlayer(769):     at android.media.MediaPlayer.create(MediaPlayer.java:530)  
DEBUG/MediaPlayer(769):     at android.media.MediaPlayer.create(MediaPlayer.java:507)   
...

Я нацеливаюсь на SDK 1.6.

Ответы [ 7 ]

5 голосов
/ 04 ноября 2009

Этот обходной позволяет воспроизводить файлы M4A из сети (и файлы AAC в других контейнерах, таких как MP4 и 3GP). Он просто загружает файл и воспроизводит из кеша.

private File mediaFile;

private void playAudio(String mediaUrl) {
    try {
        URLConnection cn = new URL(mediaUrl).openConnection();
        InputStream is = cn.getInputStream();

        // create file to store audio
        mediaFile = new File(this.getCacheDir(),"mediafile");
        FileOutputStream fos = new FileOutputStream(mediaFile);   
        byte buf[] = new byte[16 * 1024];
        Log.i("FileOutputStream", "Download");

        // write to file until complete
        do {
            int numread = is.read(buf);   
            if (numread <= 0)  
                break;
            fos.write(buf, 0, numread);
        } while (true);
        fos.flush();
        fos.close();
        Log.i("FileOutputStream", "Saved");
        MediaPlayer mp = new MediaPlayer();

        // create listener to tidy up after playback complete
        MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
                // free up media player
                mp.release();
                Log.i("MediaPlayer.OnCompletionListener", "MediaPlayer Released");
            }
        };
        mp.setOnCompletionListener(listener);

        FileInputStream fis = new FileInputStream(mediaFile);
        // set mediaplayer data source to file descriptor of input stream
        mp.setDataSource(fis.getFD());
        mp.prepare();
        Log.i("MediaPlayer", "Start Player");
        mp.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4 голосов
/ 02 июня 2014

Существует OpenMXPlayer с открытым исходным кодом , который иллюстрирует, как обрабатывать аудио как для локальных файлов, так и для онлайн / потоковых источников. Он поддерживает не только AAC, но и другие популярные форматы.

Идея, стоящая за этим, заключается в использовании API MEdiaCodec, представленного в Android 4.1.

Надеюсь, это станет хорошей отправной точкой для тех, кому нужна быстрая и удобная реализация аудиоплеера.

2 голосов
/ 20 апреля 2013

Существует бесплатный декодер Advanced Audio (AAC) для Android . Вы можете использовать это для справки и навигации или использовать многопользовательский класс для воспроизведения аудио. В нем есть пример приложения и библиотека, которые помогут вам понять

Надеюсь, это поможет

1 голос
/ 21 июня 2017

Я тоже попробовал, но не смог найти решение!

Во время последнего ввода-вывода Google я увидел кое-что, что мне очень помогло. Это расширение от MediaPlayer и много чего улучшить! Посмотри.

EXOPLAYER МОЖЕТ ПОМОЧЬ ВАМ МНОГО

Проверьте эту часть примера:

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 256;
...

// String with the url of the radio you want to play
String url = getRadioUrl();
Uri radioUri = Uri.parse(url);
// Settings for exoPlayer
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo");
DataSource dataSource = new DefaultUriDataSource(context, null, userAgent);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT);
audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
// Prepare ExoPlayer
exoPlayer.prepare(audioRenderer);

EXOPLAYER - я могу проигрывать что угодно из потокового видео (видео и аудио)!

ДАЙТЕ МНЕ ЗНАТЬ, ЕСЛИ ВАМ НУЖНА ПОМОЩЬ В РЕАЛИЗАЦИИ :)

0 голосов
/ 09 августа 2010

Я написал небольшой блог о облачном решении, которое я использую для музыкального плеера, который я разрабатываю. Он основан на молодом проекте Android Cloud Services (ACS), который пока недоступен, но все же показывает потенциальное решение с использованием облачного транскодирования для потоковой передачи любых мультимедийных файлов. Посмотрите: http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html

Joel

0 голосов
/ 31 декабря 2009

попробуй -

1) MP.prepareAsync()

2) onPrepared() { mp.start() }

0 голосов
/ 03 ноября 2009

Это дикий выстрел в темноте, но я видел подобное поведение с флеш-плеером, когда он фактически игнорирует имя файла и полагается только на тип MIME, отправленный сервером. Есть идеи, какие заголовки отправляются с example.com ? Возможно, вы захотите обернуть ваш blah.m4a в страницу, которая может установить заголовки, а затем передать двоичные данные. Дайте этим типам шанс, и сообщество будет благодарно за подтверждение того, что работает:

аудио / MPEG аудио / mp4a аудио / mp4a-latm аудио / ААС аудио / х-ААС

...