我可以将Firebase存储用于在线音乐流媒体吗?

时间:2016-09-29 07:36:19

标签: android firebase audio-streaming firebase-storage

我想要的是在Firebase存储上保存mp3文件,然后将其流式传输到Android设备。 Firebase上的所有教程都讨论了图像文件的上传和下载。

如果有任何其他云比Firebase更容易存储和流式传输音频,那么请建议。

1 个答案:

答案 0 :(得分:12)

  1. Firebase提供 StreamDownloadTask ,正如迈克建议的那样,获取 InputStream 但遗憾的是 MediaPlayer 不接受直接流。现在 如果我们非常想继续使用InputStream,我们有2个选项 - 据我所知 -

    一个。在临时文件中写入一个流并将其传递给媒体播放器。就个人而言,我不推荐这种方法。它包括不必要的数据写入,您还必须在流数据,文件写入和媒体播放之间维护同步

    湾创建 StreamProxy 服务器作为npr新闻App正在做。您可以找到App here的源代码。

  2. 从Firebase播放音乐文件的简单方法是首先使用存储参考获取下载URL ,然后将该URL作为dataSource传递给媒体播放器。以下是代码段 -

    public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {
    
            private MediaPlayer mMediaplayer;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                mMediaplayer = new MediaPlayer();
                mMediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                fetchAudioUrlFromFirebase();
            }
    
            private void fetchAudioUrlFromFirebase() {
                final FirebaseStorage storage = FirebaseStorage.getInstance();
                // Create a storage reference from our app
                StorageReference storageRef = storage.getReferenceFromUrl("PATH_OF_YOUR_AUDIO_FILE");
                storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        try {
                            // Download url of file
                            final String url = uri.toString();
                            mMediaplayer.setDataSource(url);
                            // wait for media player to get prepare
                            mMediaplayer.setOnPreparedListener(MainActivity.this);
                            mMediaplayer.prepareAsync();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                    }
                })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.i("TAG", e.getMessage());
                            }
                        });
    
            }
    
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        }