我需要播放实时音频流,实际上它是无线电.问题是我还需要管理20分钟的流量缓冲区.据我所知,用android实现起来并不容易.
首先我检查了MediaPlayer,但它没有提供任何缓冲区管理方法.实际上你甚至无法直接设置缓冲区大小.
其次,我尝试使用本地文件管理缓冲区:逐步将流下载到临时文件并切换它们.但是当您想切换到以下文件(在MediaPlayer中更改数据源)时,音频不会连续播放.你可以听到短暂的中断.
最后一个想法是使用流代理.通常它用于在8以下的Android版本中播放流.在流代理中,您创建ServerSocket,从音频流中读取并写入播放器.所以实际上我可以在那里管理缓冲.我可以缓存流并写入MediaPlayer,无论我想要什么.但.它不适用于Android 8.
我得到异常:通过对等java.net.SocketException重置连接:由peer重置连接.MediaPlayer 8不想从套接字读取数据.
因此,我有两个问题:1)实现流缓冲的其他方法是什么?2)如何为Android 8改编StreamProxy?
任何想法都表示赞赏.
谢谢
有关我最近的问题MediaRecorder和createPipe()和的讨论createPipe()技术,这个其他SO问题,我现在正在试图获得MediaPlayer与所服务的内容合作ContentProvider通过ParcelFileDescriptor和createPipe().
这个示例项目是我迄今为止的工作.它基于较早的示例,该示例播放存储为原始资源的OGG剪辑.因此,我知道我的剪辑很好.
我已将MediaPlayer设置更改为:
private void loadClip() {
try {
mp=new MediaPlayer();
mp.setDataSource(this,
PipeProvider.CONTENT_URI.buildUpon()
.appendPath("clip.ogg")
.build());
mp.setOnCompletionListener(this);
mp.prepare();
}
catch (Exception e) {
goBlooey(e);
}
}
Run Code Online (Sandbox Code Playgroud)
通过登录PipeProvider,我发现我的Uri构建正确.
PipeProvider与此示例项目中的相同,适用于将PDF提供给Adobe Reader,这限制了我的代码的使用方式.:-)
具体来说,openFile()创建一个管道ParcelFileDescriptor:
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
ParcelFileDescriptor[] pipe=null;
try {
pipe=ParcelFileDescriptor.createPipe();
AssetManager assets=getContext().getResources().getAssets();
new …Run Code Online (Sandbox Code Playgroud) 是否可以AudioTrack从资源文件夹raw 播放wav文件?它尝试了很多方法来引用我的Android项目中的原始文件,但是我有很多例外.
这就是我现在所拥有的,但是当我按下按钮时,没有声音播放.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button buttonPlayAudioTrack = (Button) findViewById(R.id.buttonPlayAudioTrack);
buttonPlayAudioTrack.setOnClickListener(this);
int minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
}
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == R.id.buttonPlayAudioTrack)
playSound();
}
private void playSound() {
audioTrack.play();
int i = 0;
int bufferSize = 512;
byte [] buffer = new byte[bufferSize];
InputStream inputStream = getResources().openRawResource(R.raw.piano12);
try {
while((i = inputStream.read()) != -1)
audioTrack.write(buffer, 0, …Run Code Online (Sandbox Code Playgroud)