Потоковое аудио AAC с Android
Как я понимаю, 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.
Ответы
Ответ 1
Этот рабочий процесс позволяет воспроизводить файлы 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();
}
}
Ответ 2
Существует open source OpenMXPlayer, который иллюстрирует, как обрабатывать аудио как для локальных файлов, так и для онлайн-источников. Он поддерживает не только AAC, но и другие популярные форматы.
Идея этого заключается в использовании API MEdiaCodec, представленного в Android 4.1.
Надеюсь, это станет хорошей отправной точкой для тех, кто нуждается в быстрой и удобной реализации аудиоплеера.
Ответ 3
Существует Freeware Advanced Audio (AAC) Decoder для Android. Вы можете использовать это для справки и руководства или использовать в нем многопользовательский класс для воспроизведения аудио aac. В нем есть пример приложения и библиотеки, которые помогут вам понять
Надеюсь, что это поможет
Ответ 4
Это дикий снимок в темноте, но я видел подобное поведение с флеш-плейером, где он фактически игнорирует имя файла и только полагается на тип MIME, отправленный сервером. Любая идея, какие заголовки отправляются с example.com? Вы можете попытаться обернуть свой blah.m4a на странице, которая может устанавливать заголовки, а затем передавать двоичные данные. Дайте этим типам выстрел, и сообщество будет благодарно за подтверждение того, что работает:
аудио/MPEG
аудио /mp 4a
аудио/mp4a-latm
аудио/ААС
аудио/х-ААС
Ответ 5
Я написал небольшой блог о облачном решении, которое я использую для музыкального проигрывателя, который я разрабатываю. Он основан на молодом проекте Android Cloud Services (ACS), который пока недоступен, но все же он показывает потенциальное решение, использующее перекодирование на основе облака для потоковой передачи любых медиафайлов. Посмотрите: http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html
Joel
Ответ 6
Я тоже попробовал, но не смог найти решение!
Во время последнего ввода/вывода Google я увидел что-то, что мне очень помогло. Он расширяется с MediaPlayer и улучшает многое! Посмотрите.
ЭКСПЛИЙЕР МОЖЕТ ПОМОЧЬ ВАМ МНОГО
Проверьте эту часть примера:
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 - я могу воспроизводить что-нибудь из потокового видео (аудио и видео)!
ПОЗВОЛЬТЕ МНЕ ЗНАТЬ, ЕСЛИ ВАМ НУЖНО ПОМОЧЬ, ЧТОБЫ ОСУЩЕСТВИТЬ ЭТО!:)
Ответ 7
попробуйте -
1) MP.prepareAsync()
2) onPrepared() { mp.start() }