You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP或Python实现自定义音频文件连续直播流?

实现自定义音频文件连续直播流的方案

首先明确:Pusher确实仅针对实时文本/JSON消息场景,不适合传输音频媒体流,所以需要结合专业流媒体服务器来实现你的需求,以下分PHP(Laravel)和Python两种优先方案给出具体建议:

PHP(Laravel)方案

核心架构:Laravel + Icecast/Shoutcast 流媒体服务器

Icecast和Shoutcast是成熟的开源音频流服务器,专门用于连续音频广播,完美适配你的网络电台需求。Laravel负责业务逻辑管理,流媒体服务器负责音频流传输。

  • 步骤1:部署流媒体服务器
    安装Icecast(开源免费,推荐),配置基本参数(端口、挂载点、播放列表路径),让服务器指向Laravel生成的动态播放列表文件。

  • 步骤2:Laravel端管理与音频处理

    • 用Laravel实现音频文件上传、存储(本地或对象存储),并将播放队列维护在数据库中。
    • 集成ffmpeg统一音频格式:将上传的音频转为Icecast支持的MP3/OGG格式,Laravel中可直接调用命令行或使用php-ffmpeg包:
      // 示例:用php-ffmpeg转码音频
      $ffmpeg = FFMpeg\FFMpeg::create();
      $audio = $ffmpeg->open(storage_path('app/uploads/raw-audio.wav'));
      $audio->filters()->resample(new \FFMpeg\Coordinate\AudioRate(44100));
      $audio->save(new \FFMpeg\Format\Audio\Mp3(), storage_path('app/stream-ready/audio.mp3'));
      
    • 定时生成动态播放列表:从数据库队列读取音频路径,生成.m3u或.pls文件供Icecast加载。
  • 步骤3:前端播放
    直接使用HTML5 <audio>标签,指向Icecast的流地址即可实现连续播放:

    <audio controls autoplay>
      <source src="http://your-server:8000/radio-stream" type="audio/mpeg">
    </audio>
    

Python方案

核心架构:Flask/Django + Liquidsoap 流媒体工具

Liquidsoap是专注于流式音频的脚本工具,支持自动连续播放、动态队列调整,搭配Python后端可快速搭建自定义电台。

  • 步骤1:配置Liquidsoap
    安装Liquidsoap后,编写简单配置脚本,指定音频文件目录或动态播放列表:

    # 示例Liquidsoap配置:从目录读取音频并循环播放
    music = playlist("/path/to/your/audio/files")
    output.icecast(%mp3, host="localhost", port=8000, password="your-password", mount="radio-stream", music)
    

    启动Liquidsoap后即可生成稳定的音频流。

  • 步骤2:Python后端管理

    • 用Flask/Django实现音频上传、队列管理,通过修改Liquidsoap的播放列表文件或调用其Telnet远程控制接口,实时更新播放内容。
    • 若需轻量流传输,可使用pyaudio读取音频文件,结合flask-streaming扩展实现HTTP流,但稳定性不如Liquidsoap。
  • 步骤3:HLS协议适配(可选)
    若要兼容移动端,可将音频切片为HLS片段,用Python生成.m3u8播放列表:

    # 示例:用ffmpeg切片音频为HLS片段
    import subprocess
    subprocess.run([
        "ffmpeg", "-i", "/path/to/audio.mp3",
        "-c:a", "aac", "-b:a", "128k",
        "-hls_time", "10", "-hls_list_size", "0",
        "/path/to/hls/stream.m3u8"
    ])
    

    前端使用HLS.js库加载.m3u8地址实现播放。

通用建议

  • 统一音频格式:将所有音频转为MP3或AAC,避免流传输时的格式兼容问题。
  • 预加载机制:服务器端提前加载下一首音频文件,减少播放切换时的中断。
  • 实时控制:若需要用户互动(如点歌),后端更新播放队列后,通知流媒体服务器重新加载列表即可。

内容的提问来源于stack exchange,提问作者Amir Sasani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:41:32