使用Android流式传输AAC音频

时间:2009-10-30 16:45:06

标签: android audio aac m4a

据我了解,如果编码为MPEG-4或3GPP,Android将只播放AAC格式的音频。

我可以播放编码为M4A的AAC音频,当它在应用程序的本地时,但是从服务器获取它时会失败。

以下工作,因为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。

8 个答案:

答案 0 :(得分:5)

解决方法允许您从网络播放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();
    }
}

答案 1 :(得分:4)

有一个open source OpenMXPlayer说明了如何处理本地文件或在线/流媒体源的音频。它不仅支持AAC,还支持其他流行格式。

背后的想法是使用Android 4.1中引入的MEdiaCodec API。

希望这为需要快速轻松的音频播放器实现的任何人提供了一个良好的起点。

答案 2 :(得分:2)

有一个Freeware Advanced Audio (AAC) Decoder for Android。您可以使用它来获取帮助和指导,或使用其中的多人游戏类来播放aac音频。其中有一个示例应用程序和库,可帮助您理解

希望这有帮助

答案 3 :(得分:1)

我也尝试了,但我找不到解决方案!

在上一次Google I / O中,我看到了一些对我有帮助的东西。它是从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-我可以播放任何流媒体(视频和音频)!

让我知道您是否需要帮助实施! :)

答案 4 :(得分:0)

这是一个黑暗中的疯狂镜头,但我看到了与Flash播放器类似的行为,它实际上忽略了文件名,只依赖于服务器发送的MIME类型。知道从 example.com 发送什么标题?您可能想尝试将blah.m4a包装在可以设置标头然后流式传输二进制数据的页面中。给这些类型一个镜头,社区将欣赏有效的确认:

音频/ MPEG 音频/ MP4A 音频/ MP4A-个大气压 音频/ AAC 音频/ X-AAC

答案 5 :(得分:0)

我在一个基于云的解决方案上写了一篇小博客,我将其用于我正在开发的音乐播放器。它基于尚未推出的年轻Android云服务(ACS)项目,但仍然显示了使用基于云的转码来传输任何媒体文件的潜在解决方案。看看:http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html

乔尔

答案 6 :(得分:0)

我发现,如果您使用以下属性在Android上录制音频文件,则可以在服务器上播放它。它也可以在HTML Audio元素中很好地播放,但是目前仅在Firefox上可以播放。将来可能会改变。

Android(JAVA):

mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
mediaRecorder.setAudioSamplingRate(44100);
mediaRecorder.setAudioChannels(1);
mediaRecorder.setOutputFile(filePath);

HTML:

<audio id="audioMediaControl" controls src="yourfile.m4a"> Your browser does not support the audio element. </audio>

答案 7 :(得分:-2)

尝试 -

1)MP.prepareAsync()

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