Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Android播放AAC音频流_Android_Audio_Aac_M4a - Fatal编程技术网

通过Android播放AAC音频流

通过Android播放AAC音频流,android,audio,aac,m4a,Android,Audio,Aac,M4a,据我所知,如果AAC格式的音频编码为MPEG-4或3GPP,Android将只播放AAC格式的音频 我可以在应用程序本地播放编码为M4A的AAC音频,但从服务器获取时失败 由于m4a文件在本地保存在res/raw目录中,因此以下方法可以起作用 MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*); mp.start(); 下面的方法不起作用。(但与MP3的) 有人能解释为什么m4a音频文件不是本地文件时会失败吗 下面是(一些)错误 ER

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

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

由于m4a文件在本地保存在res/raw目录中,因此以下方法可以起作用

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*);
mp.start();
下面的方法不起作用。(但与MP3的)

有人能解释为什么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。

这是一个黑暗中的疯狂尝试,但我在flash player中看到过类似的行为,它实际上忽略了文件名,只依赖于服务器发送的MIME类型。知道example.com发送的是什么标题吗?您可能希望尝试将blah.m4a包装到一个页面中,该页面可以设置标题,然后流式传输二进制数据。给这些类型的人一次机会,社区将希望确认哪些是有效的:

音频/mpeg 音频/mp4a 音频/mp4a latm 音频/aac
音频/x-aac

此解决方案允许您从网络播放M4A文件(以及MP4和3GP等其他容器中的aac文件)。它只是下载文件并从缓存中播放

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();
    }
}
私有文件mediaFile;
专用void播放音频(字符串mediaUrl){
试一试{
URLConnection cn=新URL(mediaUrl).openConnection();
InputStream=cn.getInputStream();
//创建文件以存储音频
mediaFile=新文件(this.getCacheDir(),“mediaFile”);
FileOutputStream fos=新的FileOutputStream(mediaFile);
字节buf[]=新字节[16*1024];
Log.i(“FileOutputStream”,“Download”);
//写入文件直到完成
做{
int numread=is.read(buf);
如果(numread尝试--

1)
MP.prepareAsync()


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

我也试过,但找不到解决方案

在上一次谷歌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-我可以播放任何流媒体(视频和音频)


如果您需要帮助来实现它,请告诉我。!:)

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

Android(JAVA):

HTML:


您的浏览器不支持音频元素。

这是一个很好的建议-谢谢。不幸的是,我没有尝试过一系列可能的内容类型。下面我列出了一些不起作用的内容类型,以供参考。仍然有可能与HTTP头或其他内容有关-可能是因为它非常挑剔t它可以提供什么。
audio/m4a audio/aac audio/aacp audio/x-aac audio/mpeg audio/mp4a audio/mp4a latm audio/mp4
但是需要。你把编码和文件格式混淆了。AAC是一种音频编码格式。M4A是一种文件类型或包,位于AAC数据周围。3GPP类似,但可以包含其他类型的编码音频。请参见此处和此处。没错,我应该将3GPP和M4A描述为“容器”对于AAC音频。我认为M4A可能只用于静态文件,而3GPP只能使用RTSP而不是HTTP进行流式传输?这将导致HTTP流式传输出现问题。如果我错了,请纠正我…好主意,但当然这需要先下载整个文件,然后才能播放。在某些情况下可能会有用s但显然不适合作为流媒体解决方案。这是真的,尽管此代码可以构建为使用本地文件作为临时循环缓冲区创建流媒体解决方案。不幸的是,MediaPlayer无法从InputStream接收数据,或者您可以用标准方式执行循环缓冲。
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);
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);