当前位置: 首页 > 知识库问答 >
问题:

如何将amazon s3 bucket中的音频文件播放到android media player中?

仲孙兴旺
2023-03-14

我正在使用android媒体播放器在我的应用程序中播放音频。我用于在媒体播放器中设置数据源的URL来自s3 amazon桶,它存储在amazon服务器中。该文件是使用FTP协议提供的。

问题:如果我在浏览器中检查我正在使用的URL,那么它会自动开始下载(就像使用FTP一样)。如果我签入我的应用程序,那么启动它将花费太多时间(例如,10 MB大小的片段需要7分钟才能播放1分钟)

我的结论是,MediaPlayer首先从URL下载音频,然后开始播放。所以下载需要时间。

我希望它可以直接在媒体播放器内播放,而不是先下载。

URL类型:https://demo-podcast.s3.us-west-1.amazonaws.com/media/clips/41e7d280-cde1-4676-95ff-f7026ae6bdde.mp3

有人知道吗?提前谢谢!

编辑:这里是我的mediaplayer代码,我在recyclerview中使用它。

 private fun attachMusic(data: ClipsResponse.ClipsResponseItem, binding: ItemLayoutCardBinding, mediaPlayer: MediaPlayer) {

    binding.apply {
        try {
            mediaPlayer.setAudioAttributes(AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build())
            mediaPlayer.setDataSource(data.audioUrl)
            mediaPlayer.prepare()
            setControls(this, mediaPlayer)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        mediaPlayer.setOnCompletionListener {
            btnPlay.setImageResource(R.drawable.ic_play_circle)
            it.release()
        }
    }
}

private fun setControls(binding: ItemLayoutCardBinding, mediaPlayer: MediaPlayer) {
    binding.apply {
        seekBar.setMax(mediaPlayer.duration)
        mediaPlayer.start()
        playCycle(this, mediaPlayer)
        if (mediaPlayer.isPlaying) {
            btnPlay.setImageResource(R.drawable.ic_pause_circle)
            playProgressBar.isVisible = false
          )
        }
        seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                if (fromUser) {
                    mediaPlayer.seekTo(progress)
                    
                }
            }

            override fun onStartTrackingTouch(seekBar: SeekBar) {}
            override fun onStopTrackingTouch(seekBar: SeekBar) {}
        })
    }
}

private fun playCycle(binding: ItemLayoutCardBinding, mediaPlayer: MediaPlayer) {
    val handler = Handler()
    binding.apply {
        try {
            seekBar.setProgress(mediaPlayer.currentPosition)
          
            if (mediaPlayer.isPlaying) {
                val runnable = Runnable { playCycle(binding, mediaPlayer) }
                handler.postDelayed(runnable, 100)
            }
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
    }
}

共有1个答案

万铭
2023-03-14

请删除mediaPlayer。在代码中准备()并添加mediaPlayer。prepareAsync()

 类似资料:
  • 问题内容: 我不了解pyaudio的示例材料。看来他们写了整个小程序,这让我失望了。 如何只播放一个音频文件? 格式不是问题,我只想知道播放音频文件所需的最少代码。 问题答案: 这个例子对我来说似乎很清楚。您只需将示例另存为playwav.py调用即可: 带有一些额外注释的wave示例:

  • 我对javascript和discord.js很陌生,有人知道如何让机器人加入一个频道,播放一个文件然后离开吗? 以下是我尝试过的: 现在,它将发送消息加入语音通道,而不管我是否在其中,如果我在其中,它就不会加入语音通道并播放文件。任何帮助都很感激。

  • 我尝试建立一个按钮,一旦点击它播放一个音频文件,如果再次点击它停止它。在按钮中,有一个属性src,其中放置了应该播放的文件的路径。 null null 当我尝试单击该按钮时,日志显示“”。但音频已设置,警报显示文件路径在那里。 我做错了什么?

  • 我尝试从res/raw文件夹播放音频文件,这是我用来播放文件的代码,这不会产生任何错误,并且我的设备音量最大,但没有任何声音。我尝试了MP3和WAV文件。 启动后我在 LogCat 上收到以下消息 帮助我解决这个问题,将不胜感激。

  • 问题内容: 我正在寻找一种轻松播放远程 .mp3 文件的解决方案。我看过适用于本地文件的“ pyglet”模块,但似乎无法处理远程文件。我可以临时下载 .mp3 文件,但是由于 .mp3 文件看起来太大,因此不建议这样做。 我宁愿它用于跨平台而不是仅用于Windows等。 例如,播放来自以下位置的音频文件: http://example.com/sound.mp3 只需在下载文件时流式传输文件,我

  • 函数名称: 播放音频 函数功能: 在后台播放指定的声音文件 函数方法 media.playAudio(path,vol,flag) 参数 类型 必填 说明 path string 是 音频文件名,支持 mp3、m4a、m4r、ogg、wav vol string 否 音频音量,不写默认,使用当前设置的音量 flag string 否 是否循环播放,不写默认为 false - 不循环,true -