Java 音频流(mp3spi lib),UnsupportedAudioFileException

2024-01-09

我看到了多个关于流 MP3 流(如 Icecast)的 Stack Overflow 问题。他们都说使用 MP3SPI 库,我就是这样。 MP3SPI 用于允许支持audio/mpeg哑剧类型。这就是我的 Icecast 流。我的类路径中正确包含了所有三个 jar 文件,但是在使用它们在示例中提供的相同代码时,我仍然得到UnsupportedAudioFileException:

 javax.sound.sampled.UnsupportedAudioFileException: could not get audio input str
eam from input URL
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:
1153)
    at DJUtils.testPlay(DJUtils.java:16)
    at DJ.play(DJ.java:13)
    at DJ.init(DJ.java:4)
    at Loader.main(Loader.java:69)

这是我的代码:

public static void testPlay(){
    try {
        AudioInputStream in= AudioSystem.getAudioInputStream(new URL("http://localhost:8000/listen.m3u"));
        AudioInputStream din = null;
        AudioFormat baseFormat = in.getFormat();
        AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                baseFormat.getSampleRate(),
                16,
                baseFormat.getChannels(),
                baseFormat.getChannels() * 2,
                baseFormat.getSampleRate(),
                false);
        din = AudioSystem.getAudioInputStream(decodedFormat, in);
        // Play now.
        rawplay(decodedFormat, din);
        in.close();
    } catch (Exception e){
        e.printStackTrace();
    }
}

private static void rawplay(AudioFormat targetFormat, AudioInputStream din) throws LineUnavailableException, IOException{
    try{
        byte[] data = new byte[4096];
        SourceDataLine line = getLine(targetFormat);
        if (line != null)
        {
            // Start
            line.start();
            int nBytesRead = 0, nBytesWritten = 0;
            while (nBytesRead != -1)
            {
                nBytesRead = din.read(data, 0, data.length);
                if (nBytesRead != -1) nBytesWritten = line.write(data, 0, nBytesRead);
            }
            // Stop
            line.drain();
            line.stop();
            line.close();
            din.close();
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}

private static SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException{
    try{
        SourceDataLine res = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
        res = (SourceDataLine) AudioSystem.getLine(info);
        res.open(audioFormat);
        return res;
    }catch(LineUnavailableException e){
        e.printStackTrace();
        return null;
    }
} 

我这个项目的启动脚本:

java -Dfile.encoding=Cp1252 -classpath bin;lib/libs.jar;lib/graphics.jar;lib/mp3spi/mp3spi.jar;lib/mp3spi/jl.jar;lib/mp3spi/tritonus.jar; Loader

我的 Icecast 控制面板显示当前正在流式传输audio/mpeg。我可以通过在任何媒体播放器中打开代码中的 URL 来正常访问我的流。有人可以指出我做错了什么吗?谢谢!


mp3spi 库本身不将 m3u 播放列表文件视为受支持的文件。

尝试使用 m3u 文件中使用的真实流 url。即直接指向 mp3 文件或流的 url。

检查下面的功能。它直接来自 MpegAudioFileReader.java,mp3spi 库用于识别您使用 URL 呈现的数据流的格式。它无法识别 m3u 文件。如果需要,您可以检查来源http://www.javazoom.net/mp3spi/sources.html http://www.javazoom.net/mp3spi/sources.html.

    public AudioFileFormat getAudioFileFormat(InputStream inputStream, long mediaLength) throws UnsupportedAudioFileException, IOException
{
    if (TDebug.TraceAudioFileReader) TDebug.out(">MpegAudioFileReader.getAudioFileFormat(InputStream inputStream, long mediaLength): begin");
    HashMap aff_properties = new HashMap();
    HashMap af_properties = new HashMap();
    int mLength = (int) mediaLength;
    int size = inputStream.available();
    PushbackInputStream pis = new PushbackInputStream(inputStream, MARK_LIMIT);
    byte head[] = new byte[22];
    pis.read(head);
    if (TDebug.TraceAudioFileReader)
    {
        TDebug.out("InputStream : " + inputStream + " =>" + new String(head));
    }

    // Check for WAV, AU, and AIFF, Ogg Vorbis, Flac, MAC file formats.
    // Next check for Shoutcast (supported) and OGG (unsupported) streams.
    if ((head[0] == 'R') && (head[1] == 'I') && (head[2] == 'F') && (head[3] == 'F') && (head[8] == 'W') && (head[9] == 'A') && (head[10] == 'V') && (head[11] == 'E'))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("RIFF/WAV stream found");
        int isPCM = ((head[21]<<8)&0x0000FF00) | ((head[20])&0x00000FF);
        if (weak == null)
        {
            if (isPCM == 1) throw new UnsupportedAudioFileException("WAV PCM stream found");
        }

    }
    else if ((head[0] == '.') && (head[1] == 's') && (head[2] == 'n') && (head[3] == 'd'))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("AU stream found");
        if (weak == null) throw new UnsupportedAudioFileException("AU stream found");
    }
    else if ((head[0] == 'F') && (head[1] == 'O') && (head[2] == 'R') && (head[3] == 'M') && (head[8] == 'A') && (head[9] == 'I') && (head[10] == 'F') && (head[11] == 'F'))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("AIFF stream found");
        if (weak == null) throw new UnsupportedAudioFileException("AIFF stream found");
    }
    else if (((head[0] == 'M') | (head[0] == 'm')) && ((head[1] == 'A') | (head[1] == 'a')) && ((head[2] == 'C') | (head[2] == 'c')))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("APE stream found");
        if (weak == null) throw new UnsupportedAudioFileException("APE stream found");
    }
    else if (((head[0] == 'F') | (head[0] == 'f')) && ((head[1] == 'L') | (head[1] == 'l')) && ((head[2] == 'A') | (head[2] == 'a')) && ((head[3] == 'C') | (head[3] == 'c')))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("FLAC stream found");
        if (weak == null) throw new UnsupportedAudioFileException("FLAC stream found");
    }
    // Shoutcast stream ?
    else if (((head[0] == 'I') | (head[0] == 'i')) && ((head[1] == 'C') | (head[1] == 'c')) && ((head[2] == 'Y') | (head[2] == 'y')))
    {
        pis.unread(head);
        // Load shoutcast meta data.
        loadShoutcastInfo(pis, aff_properties);
    }
    // Ogg stream ?
    else if (((head[0] == 'O') | (head[0] == 'o')) && ((head[1] == 'G') | (head[1] == 'g')) && ((head[2] == 'G') | (head[2] == 'g')))
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("Ogg stream found");
        if (weak == null) throw new UnsupportedAudioFileException("Ogg stream found");
    }
    // No, so pushback.
    else
    {
        pis.unread(head);
    }
    // MPEG header info.
    int nVersion = AudioSystem.NOT_SPECIFIED;
    int nLayer = AudioSystem.NOT_SPECIFIED;
    int nSFIndex = AudioSystem.NOT_SPECIFIED;
    int nMode = AudioSystem.NOT_SPECIFIED;
    int FrameSize = AudioSystem.NOT_SPECIFIED;
    int nFrameSize = AudioSystem.NOT_SPECIFIED;
    int nFrequency = AudioSystem.NOT_SPECIFIED;
    int nTotalFrames = AudioSystem.NOT_SPECIFIED;
    float FrameRate = AudioSystem.NOT_SPECIFIED;
    int BitRate = AudioSystem.NOT_SPECIFIED;
    int nChannels = AudioSystem.NOT_SPECIFIED;
    int nHeader = AudioSystem.NOT_SPECIFIED;
    int nTotalMS = AudioSystem.NOT_SPECIFIED;
    boolean nVBR = false;
    AudioFormat.Encoding encoding = null;
    try
    {
        Bitstream m_bitstream = new Bitstream(pis);
        aff_properties.put("mp3.header.pos", new Integer(m_bitstream.header_pos()));
        Header m_header = m_bitstream.readFrame();
        // nVersion = 0 => MPEG2-LSF (Including MPEG2.5), nVersion = 1 => MPEG1
        nVersion = m_header.version();
        if (nVersion == 2) aff_properties.put("mp3.version.mpeg", Float.toString(2.5f));
        else aff_properties.put("mp3.version.mpeg", Integer.toString(2 - nVersion));
        // nLayer = 1,2,3
        nLayer = m_header.layer();
        aff_properties.put("mp3.version.layer", Integer.toString(nLayer));
        nSFIndex = m_header.sample_frequency();
        nMode = m_header.mode();
        aff_properties.put("mp3.mode", new Integer(nMode));
        nChannels = nMode == 3 ? 1 : 2;
        aff_properties.put("mp3.channels", new Integer(nChannels));
        nVBR = m_header.vbr();
        af_properties.put("vbr", new Boolean(nVBR));
        aff_properties.put("mp3.vbr", new Boolean(nVBR));
        aff_properties.put("mp3.vbr.scale", new Integer(m_header.vbr_scale()));
        FrameSize = m_header.calculate_framesize();
        aff_properties.put("mp3.framesize.bytes", new Integer(FrameSize));
        if (FrameSize < 0) throw new UnsupportedAudioFileException("Invalid FrameSize : " + FrameSize);
        nFrequency = m_header.frequency();
        aff_properties.put("mp3.frequency.hz", new Integer(nFrequency));
        FrameRate = (float) ((1.0 / (m_header.ms_per_frame())) * 1000.0);
        aff_properties.put("mp3.framerate.fps", new Float(FrameRate));
        if (FrameRate < 0) throw new UnsupportedAudioFileException("Invalid FrameRate : " + FrameRate);
        if (mLength != AudioSystem.NOT_SPECIFIED)
        {
            aff_properties.put("mp3.length.bytes", new Integer(mLength));
            nTotalFrames = m_header.max_number_of_frames(mLength);
            aff_properties.put("mp3.length.frames", new Integer(nTotalFrames));
        }
        BitRate = m_header.bitrate();
        af_properties.put("bitrate", new Integer(BitRate));
        aff_properties.put("mp3.bitrate.nominal.bps", new Integer(BitRate));
        nHeader = m_header.getSyncHeader();
        encoding = sm_aEncodings[nVersion][nLayer - 1];
        aff_properties.put("mp3.version.encoding", encoding.toString());
        if (mLength != AudioSystem.NOT_SPECIFIED)
        {
            nTotalMS = Math.round(m_header.total_ms(mLength));
            aff_properties.put("duration", new Long((long) nTotalMS * 1000L));
        }
        aff_properties.put("mp3.copyright", new Boolean(m_header.copyright()));
        aff_properties.put("mp3.original", new Boolean(m_header.original()));
        aff_properties.put("mp3.crc", new Boolean(m_header.checksums()));
        aff_properties.put("mp3.padding", new Boolean(m_header.padding()));
        InputStream id3v2 = m_bitstream.getRawID3v2();
        if (id3v2 != null)
        {
            aff_properties.put("mp3.id3tag.v2", id3v2);
            parseID3v2Frames(id3v2, aff_properties);
        }
        if (TDebug.TraceAudioFileReader) TDebug.out(m_header.toString());
    }
    catch (Exception e)
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream:" + e.getMessage());
        throw new UnsupportedAudioFileException("not a MPEG stream:" + e.getMessage());
    }
    // Deeper checks ?
    int cVersion = (nHeader >> 19) & 0x3;
    if (cVersion == 1)
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream: wrong version");
        throw new UnsupportedAudioFileException("not a MPEG stream: wrong version");
    }
    int cSFIndex = (nHeader >> 10) & 0x3;
    if (cSFIndex == 3)
    {
        if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream: wrong sampling rate");
        throw new UnsupportedAudioFileException("not a MPEG stream: wrong sampling rate");
    }
    // Look up for ID3v1 tag
    if ((size == mediaLength) && (mediaLength != AudioSystem.NOT_SPECIFIED))
    {
        FileInputStream fis = (FileInputStream) inputStream;
        byte[] id3v1 = new byte[128];
        long bytesSkipped = fis.skip(inputStream.available() - id3v1.length);
        int read = fis.read(id3v1, 0, id3v1.length);
        if ((id3v1[0] == 'T') && (id3v1[1] == 'A') && (id3v1[2] == 'G'))
        {
            parseID3v1Frames(id3v1, aff_properties);
        }
    }
    AudioFormat format = new MpegAudioFormat(encoding, (float) nFrequency, AudioSystem.NOT_SPECIFIED // SampleSizeInBits - The size of a sample
            , nChannels // Channels - The number of channels
            , -1 // The number of bytes in each frame
            , FrameRate // FrameRate - The number of frames played or recorded per second
            , true, af_properties);
    return new MpegAudioFileFormat(MpegFileFormatType.MP3, format, nTotalFrames, mLength, aff_properties);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 音频流(mp3spi lib),UnsupportedAudioFileException 的相关文章

  • 如果我在 JSP 中有 html 元素,那么执行顺序是什么?

    什么将执行第一个 body 元素或 head 元素 Head Body scriplet 如果我明白您的要求 JSP 文件中的每个元素都会按照代码从上到下出现的顺序进行处理
  • Tomcat 7 停止接收 HTTP 请求

    我有一个Tomcat 7接收大量数据的服务器GET 要求 这种方法在一段时间内效果很好 然后突然停止工作 7 8 小时后 当它停止工作时 我收到此错误 五月 06 2015 12 47 58 AM org apache coyote htt
  • 具有“繁忙”线程的 threadPoolExecutor 如何被终止?

    我的问题有点复杂 让我尝试彻底解释一下 但如果您需要更多详细信息 请随时询问我 我会添加它们 我最近 通过实验 了解到 如果线程连续工作 例如 while true 循环中的整数运算 则中断线程对其没有影响 话题继续进行 就像什么都没发生一
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin
  • Spring MVC 应用程序可以是多线程的,即使它的 servlet 不是吗?

    当您谈论 Spring 应用程序是多线程时 您是否一定是指该应用程序中定义的 servlet 是否是多线程的 或者即使应用程序中的 servlet 不是多线程 Spring 应用程序也可以配置为多线程吗 不再支持单线程 servlet 它们
  • 使用 IntentService 使用 Camera2 拍照

    我正在尝试创建一个可以拍照但不显示预览的应用程序 使用本教程 https www youtube com watch v oPu42I0HSi4 https www youtube com watch v oPu42I0HSi4如果我使用和
  • 处理响应后使用 Amazon S3 响应流

    我正在使用 Amazon SDK 并且有一个方法可以为存储在 Amazon S3 服务中的对象返回 Stream 它包含这样的内容 var request new GetObjectRequest WithBucketName bucket
  • Java 将 String[] 转换为 int[]

    我有一个 String 其中每个元素都可以转换为整数 将其转换为 int 的最佳方法是什么 int StringArrayToIntArray String s public static int StringArrToIntArr Str
  • 在 IIS 中运行 Java Web 应用程序

    有人找到了在 IIS 中运行 Java Web 应用程序的方法吗 在我看来 编写一个将 Jetty 或自定义 servlet 容器与 IIS 集成的 ISAPI 插件 这个词正确吗 应该是完全可能的 这样做的好处是 许多优秀的高端 Java
  • GWT 代码服务器在使用 Maven 原型的新生成的项目中找不到模块

    我已经使用 GWT 和 eclipse 一段时间了 我想玩一下 Maven 和 GWT 插件 gwt maven plugin 在此输入链接描述 http mojo codehaus org gwt maven plugin 我尝试在 Ec
  • Android Studio 中没有参考文档

    昨天刚刚出现了一个新问题 当我将鼠标悬停在方法上或按 Ctrl Q 时 我通常会获取该特定方法的文档信息 但现在我只是得到 按 Ctrl QSharedPreferences getLong Following external urls
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 查找前 N 个五边形数

    我必须找到第一个N pentagonal numbers 1 从 1 100 并每行显示 10 个 我必须使用getPentagonalNumber int n 方法也是如此 显然这就是它存在的原因 到目前为止 这是我的代码 package
  • 测试正确的时区处理

    我们正在处理大量数据 所有数据均以 UTC Java 语言 标记 在读取这些数据 将其存储在数据库中以及再次将其取出之间 发生了一些数据在夏令时期间关闭一小时的情况 由于 UTC 没有夏令时的概念 这显然是软件中的一个错误 一旦知道 就很容
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • Spring 4 MVC 和 Websockets - 没有合适的默认 RequestUpgradeStrategy

    我需要 Websockets 在我的应用程序中进行实时更新 所以我找到了这个例子并一步一步地做到了here http raymondhlee wordpress com 2014 01 19 using spring 4 websocket
  • 从 Spring 启动运行 Java 类

    我使用的是Java8和Spring4 3 1 我有一个 Java Spring 应用程序托管由浏览器和移动应用程序客户端访问的 RESTfult 服务 其次 我编写了一个侦听事件的聊天服务器 socket io 来自客户 该聊天服务器正在从
  • 使用用户名和密码登录 LinkedIn 失败

    LinkedIn使用oauth登录其api 服务器中无法登录api 我尝试使用http请求登录linkedin并获取oauth verifier 但我得到了这样的回应 很抱歉 出现了问题 你的申请 请确保您 启用cookie并重试 或点击此
  • 找不到 `activityViewModels()` Hilt Android

    我在我的项目中使用 Hilt 和 MVVM 我想要一个viewModel from activityViewModel在 2 个活动中使用相同的内容 但我的 Android Studio 说未解析的参考 我的应用程序 build gradl

随机推荐

  • 在不改变比例的情况下调整 Chrome 响应模式窗口的大小

    我以前可以打开开发人员工具 单击右下角的小图标打开响应模式 然后拖动窗口宽度手柄来更改设备宽度 这对于了解网站在不同设备上的表现非常有用 然而现在它只是改变了页面的比例 而不是宽度 这是垃圾 如何更改宽度并保持固定比例 EDIT 哦 可能不
  • Django haystack LocationField 创建为字符串而不是 elasticsearch 中的 geo_point

    我正在使用 django 1 8 9 django rest framework django haystack 和 Elasticsearch 并尝试让 LocationField 工作 索引已创建 但类型始终为string代替geo p
  • 只获取当前节点的文本

    在 Cheerio 中 如何仅获取当前节点的文本 var cheerio require cheerio const htmlString div hello span world span div cheerio load htmlStr
  • 检测 Outlook/回收状态并运行 Outlook 的多个实例

    有没有办法使用代码来检测 Outlook 是否会自动获取现有 Outlook 实例而不是启动新的 Outlook 实例 最好是 VBA 代码 理想情况下 还可以通过编程方式打开 关闭此行为 这里的目标是针对一组 Outlook 帐户中的数据
  • 调用 XSLT 模板并将所有输出保存到变量

    我想调用模板并将输出保存到变量中 我想保存ALL包括 HTML 标记的输出 但事实并非如此 例如 采用这个简单的 XSLT
  • 如何使 data.frame 中的组长度相等?

    我有这个数据框 df lt data frame id c A A B B B C amount c 45 66 99 34 71 22 id amount A 45 A 66 B 99 B 34 B 71 C 22 我需要扩展它以便每个b
  • 消息框挂起

    我试图在按下 winforms 应用程序上的按钮时显示消息框 但 MessageBox 挂起并且从不返回值 private void btnApply Click object sender EventArgs e bool current
  • 使用 UIAutomation 禁用 iOS 模拟器的硬件键盘

    我正在使用 UIAutomation 在 iOS 模拟器中进行一些自动化测试 在 Xcode 6 中 iOS 模拟器的键盘行为改变 https stackoverflow com a 26004815 700471为了与真实设备类似 现在有
  • 如何编写多个条件if else语句mips

    我会像编写将 C 转换为 mips 汇编的逻辑 OR 语句一样编写逻辑 AND 语句吗 else if i x j y printf c 219 这就是我放的 bne reg1 t3 draw219 i x bne reg2 t4 draw
  • 确定 Java 中的二进制/文本文件类型?

    也就是说 您如何区分存档 jar rar 等 文件和文本 xml txt 与编码无关 文件 没有保证的方法 但这里有几种可能性 查找文件上的标头 不幸的是 标头是特定于文件的 因此虽然您可能能够发现它是 RAR 文件 但您不会得到更通用的答
  • 在没有 swarm 的情况下限制 Docker compose 中的可用主机资源

    我只是想在 docker compose 文件中限制某些 Docker 容器的资源 原因很简单 主机上运行着多个应用程序 服务 所以我想避免单个容器可以使用例如所有内存 这会损害其他容器 从我了解到的文档中 这可以通过使用来完成resour
  • 用于电子邮件和页面其他部分链接的 HTML 标签

    我正在写一个HTML页面 我的要求如下 HTML 页面包含一些电子邮件 ID 当单击这些电子邮件 ID 时 它应该打开 Outlook 的新页面 页面有某些部分 当单击该部分时 它应该到达受尊重的段落 部分 例如 单击链接转到 部分 提前致
  • 在 Eclipse 项目中查找方法调用

    我有一个包含方法 myMethod 的类 X 我想在当前工作区的所有项目中找到调用 myMethod 的位置 我无法使用任何搜索函数 因为有多个类带有 myMethod 而且它不是静态的 因此 我需要知道此类的对象的名称 如果不手动探索项目
  • Jquery AJAX:如何更改“成功”按钮的值?

    我在一页上有多个按钮 单击后 我跟踪按钮 ID 将按钮值发送到后端 php 代码 该代码通过更改数据库返回更新的值 我能够取回我需要的一切 除了 成功设置按钮值 这是我正在使用的代码 document ready function inpu
  • 表单提交后验证重置

    我有带有复选框的表单 我希望用户至少选择其中之一 一切正常 但重置表单后我无法隐藏验证消息 这种情况在docs https logaretm github io vee validate guide forms html programma
  • 多个应用程序可以访问 SQLite 数据库吗?

    我遇到了一些数据库锁 SQLite BUSY 麻烦 我担心 SQLite 不适合我 基本上 我的设置是一个 cronjob 它定期调用一些不引人注目的 Java 功能和 项目中的新功能 通过一个名为 Jetty Jackson Hibern
  • Boost.Python 模块中未定义的符号

    我正在尝试使用 Boost Python 为模板库的某个实例构建一个小型 Python 扩展 该库广泛使用 CGAL 库 它与 CMake 集成得相当好 因此我将其用于我的项目 这是我的模块的代码 python export cpp inc
  • R partykit::ctree 边缘上的偏移标签

    我正在与ctree我的数据集有一个创建节点的协变量 该协变量有足够的因子 并且它们的名称足够长 以至于它们在节点创建的边中相互重叠 我想找到一种方法来阻止这种重叠 我检查了其他问题 发现一个answer https stackoverflo
  • 将 Bootstrap 导航栏转换为 WordPress 菜单

    我知道网上有很多关于此的主题 但我发现它们非常复杂 基本上我想将 Bootstrap 导航菜单转换为 WordPress 菜单 假设我有默认的 Bootstrap 导航栏
  • Java 音频流(mp3spi lib),UnsupportedAudioFileException

    我看到了多个关于流 MP3 流 如 Icecast 的 Stack Overflow 问题 他们都说使用 MP3SPI 库 我就是这样 MP3SPI 用于允许支持audio mpeg哑剧类型 这就是我的 Icecast 流 我的类路径中正确