android - 意外的状态行 : ICY 200 OK for URL openStream() method?

标签 android inputstream aac android-audiorecord

根据 kitakt 4.4 的更改,播放 shoutcast 流时存在一些问题(那些返回“ICY”而不是“HTTP/1.x”响应)。

因此 kitkat 的解决方案是在我们通过以下方式打开流之前在 JVM 中重新注册“icy”协议(protocol)前缀一次:

try {
        java.net.URL.setURLStreamHandlerFactory( new java.net.URLStreamHandlerFactory(){
            public java.net.URLStreamHandler createURLStreamHandler( String protocol ) {
                Log.d( LOG, "Asking for stream handler for protocol: '" + protocol + "'" );
                if ("icy".equals( protocol )) return new com.spoledge.aacdecoder.IcyURLStreamHandler();
                return null;
            }
        });
}
catch (Throwable t) {
        Log.w( LOG, "Cannot set the ICY URLStreamHandler - maybe already set ? - " + t );
}

我在打开音频流以使其注册时遇到问题。在我调用 url.opnestream(stream) 之后我得到了异常:

java.net.ProtocolException: Unexpected status line: ICY 200 OK

我该如何解决?


这是注册音频的示例,到目前为止我所做的..

try {
    URL url = null;
    url = new URL(u);
    inputStream = url.openStream();

    startTime = System.currentTimeMillis();

    Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

    String fileName = File.separator + "radio_" + "recording_" + channelMetadata.replaceAll("\\W", "") + System.currentTimeMillis();

    if(isSDPresent)
    {
        outputSource = Environment.getExternalStorageDirectory() + fileName;
    }
    else
    {
        outputSource = Environment.getDataDirectory() + fileName;
    }

    if(contentType.equals("audio/aacp"))
        fileOutputStream = new FileOutputStream(outputSource  + ".acc");
    else if(contentType.equals("audio/mpeg"))
        fileOutputStream = new FileOutputStream(outputSource + ".mp3");
    else
        fileOutputStream = new FileOutputStream(outputSource + ".nieznany_format");

    int bytesRead = 0;
    int bytes;
    while (((bytes = inputStream.read()) != -1) && isRecording) {

        fileOutputStream.write(bytes);
        bytesRead++;

        stopTime = System.currentTimeMillis();

        long seconds = (Math.abs(startTime-stopTime));
        int minutes = 1000 * 60 * 60;

        if(minutes<=seconds)
        {
            Log.d("xxx", "recording task exceed stopped");
            break;
        }
    }

    inputStream.close();
    fileOutputStream.close();

} catch (IOException e) {
    e.printStackTrace();
    isRecording = false;
}

isRecording = false;
return null;

最佳答案

针对 Android 4.4 进行了各种更改,Android 似乎不支持非标准的 ShoutCast ICY header 。

似乎OkHttp的好人几天前已经解决了问题(issue 1issue 2)。
您可以做的是直接在您的应用程序中使用 OkHttp lib,这样您将使用更新的 OkHttp 版本(带有修复程序的版本),而不是 Android 附带的版本(您必须等待操作系统更新)。
这还将针对在可能遇到该问题的其他设备上运行的应用程序修复此问题。

关于android - 意外的状态行 : ICY 200 OK for URL openStream() method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812483/

相关文章:

android - 旋转图像以及触摸以在android中固定点

android - 使用 http 协议(protocol)查找(跳过)输入流的最快方法

ios - 使用带回调的音频文件初始化将 MP3 转换为 AAC

android - 检测android设备是否连接到互联网

android - 更改 Expo 生成的应用程序图标

java - 访问jar中的pom.xml

video - 尽管编解码器未更改,FFMPEG 转换会创建更小的文件

android - 使用 ffmpeg 创建一个 android 可播放的音乐幻灯片

java - 如何在 Android 上用 Java 创建多图

JAVA : BufferdInputStream and BufferedOutputStream