【问题标题】:Streaming .wav audio fails, but plays when downloaded separately流式传输 .wav 音频失败,但在单独下载时播放
【发布时间】:2012-01-18 21:04:36
【问题描述】:

我在使用 androids MediaPlayer 流式传输 wav 音频文件时遇到问题。

wave 文件的 URL 已成功验证并在设备上单独下载。 那些下载的文件播放没有问题,但是当相同的文件流式传输到播放器时,它根本不会播放并出现错误。

01-18 09:25:00.963: E/MediaPlayer(8825): error (1, -4)
01-18 09:25:00.963: W/System.err(8825): java.io.IOException: Prepare failed.: status=0x1
01-18 09:25:00.963: W/System.err(8825):     at android.media.MediaPlayer.prepare(Native Method)
01-18 09:25:00.963: W/System.err(8825):     at com.movivation.wavetrial.AudioPlayer.playMedia(AudioPlayer.java:174)
01-18 09:25:00.963: W/System.err(8825):     at com.movivation.wavetrial.AudioPlayer.onCreate(AudioPlayer.java:92)
01-18 09:25:00.963: W/System.err(8825):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-18 09:25:00.963: W/System.err(8825):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
01-18 09:25:00.963: W/System.err(8825):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
01-18 09:25:00.963: W/System.err(8825):     at android.app.ActivityThread.access$2300(ActivityThread.java:126)
01-18 09:25:00.963: W/System.err(8825):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
01-18 09:25:00.963: W/System.err(8825):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-18 09:25:00.963: W/System.err(8825):     at android.os.Looper.loop(Looper.java:123)
01-18 09:25:00.963: W/System.err(8825):     at android.app.ActivityThread.main(ActivityThread.java:4633)
01-18 09:25:00.963: W/System.err(8825):     at java.lang.reflect.Method.invokeNative(Native Method)
01-18 09:25:00.973: W/System.err(8825):     at java.lang.reflect.Method.invoke(Method.java:521)
01-18 09:25:00.973: W/System.err(8825):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
01-18 09:25:00.973: W/System.err(8825):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-18 09:25:00.973: W/System.err(8825):     at dalvik.system.NativeStart.main(Native Method)
01-18 09:25:00.973: I/MediaPlayer(8825): Info (1,26)

我播放文件的代码:

private void playMedia(boolean isWebUrl) {
    mPlayer = new MediaPlayer();
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    mPlayer.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            Log.d(tag, "Ending thread");
            isPlaying = false;
            if (pd != null) {
                pd.dismiss();
            }
        }
    });

    mPlayer.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            Log.d(tag, "starting");

            mPlayer.start();
            mSeekbar.setProgress(0);
            mSeekbar.setMax(mPlayer.getDuration());

            Log.d(tag, "seek started");
            new PlayAsync().execute();
        }
    });

    mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            if (fromUser) {
                mPlayer.seekTo(progress);
                mSeekbar.setProgress(progress);
            }
        }
    });

    try {
        if (isWebUrl) {
            Log.d(tag, "playing tmp file");
            mPlayer.setDataSource(url);
        } else {
            File f = new File(fileurl);
            FileInputStream fis = new FileInputStream(f);
            mPlayer.setDataSource(fis.getFD());
        }

        Log.d(tag, "calling prepare");
        mPlayer.prepare(); //originally i use prepareAsync()
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我尝试播放的文件实际上是一个波形文件,我没有找到任何关于上述错误的具体说明。

任何关于波流或错误本身的指针都将受到高度赞赏。 谢谢。

【问题讨论】:

  • 使用示例 sn-p 编辑的问题。虽然我已经使用 prepare() 方法来临时捕获异常,但实际上我使用的是 prepareasync() 方法。
  • 您能在您的代码中突出显示这一点吗? “在 com.movi​​vation.wavetrial.AudioPlayer.playMedia(AudioPlayer.java:174)”
  • 它指向mPlayer.prepare();

标签: android audio-streaming


【解决方案1】:

嗯,这家伙似乎做了你想做的事。一起来看看吧:http://code.google.com/p/rxwen-blog-stuff/source/browse/trunk/android/streaming_audio/

【讨论】:

  • 我在主文件 w.r.t 上面的链接之后输出一些噪音
  • 嗯...两者兼而有之。在我的情况下,如果它发出声音意味着它能够从流中读取文件(比媒体播放器更好)。但是当我意识到我不知道下一步该怎么做时,问题又开始了,因为 AudioTrack 完全是手动播放音频内容字节的方式......我对此一无所知。
  • 让我们尝试在 mPlayer.setDataSource(...) 之前使用 mPlayer.reset()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多