相关疑难解决方法(0)

音频流缓冲

我需要播放实时音频流,实际上它是无线电.问题是我还需要管理20分钟的流量缓冲区.据我所知,用android实现起来并不容易.

首先我检查了MediaPlayer,但它没有提供任何缓冲区管理方法.实际上你甚至无法直接设置缓冲区大小.

其次,我尝试使用本地文件管理缓冲区:逐步将流下载到临时文件并切换它们.但是当您想切换到以下文件(在MediaPlayer中更改数据源)时,音频不会连续播放.你可以听到短暂的中断.

最后一个想法是使用流代理.通常它用于在8以下的Android版本中播放流.在流代理中,您创建ServerSocket,从音频流中读取并写入播放器.所以实际上我可以在那里管理缓冲.我可以缓存流并写入MediaPlayer,无论我想要什么.但.它不适用于Android 8.

我得到异常:通过对等java.net.SocketException重置连接:由peer重置连接.MediaPlayer 8不想从套接字读取数据.

因此,我有两个问题:1)实现流缓冲的其他方法是什么?2)如何为Android 8改编StreamProxy?

任何想法都表示赞赏.

谢谢

proxy android stream buffering media-player

21
推荐指数
2
解决办法
2万
查看次数

任何人都有MediaPlayer使用ParcelFileDescriptor和createPipe()?

有关我最近的问题MediaRecordercreatePipe()和的讨论createPipe()技术,这个其他SO问题,我现在正在试图获得MediaPlayer与所服务的内容合作ContentProvider通过ParcelFileDescriptorcreatePipe().

这个示例项目是我迄今为止的工作.它基于较早的示例,该示例播放存储为原始资源的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)

android android-mediaplayer

17
推荐指数
2
解决办法
6180
查看次数

AudioTrack Android从原始文件夹播放声音

是否可以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)

android inputstream audiotrack

6
推荐指数
1
解决办法
6263
查看次数