HLS 推流服务器(Nginx + RTMP 模块)总结

HLS 推流服务器(Nginx + RTMP 模块)总结

1. Nginx 配置(nginx.conf

worker_processes auto;

events {
    worker_connections 1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application tv {  # 推流应用名
            live on;
            hls on;
            hls_path /opt/hls/live;  # HLS 切片存储位置
            hls_fragment 3s;         # 每个TS切片时长
            hls_playlist_length 60s; # HLS播放列表长度
            hls_nested off;          # 禁用嵌套目录结构
            record off;             # 禁止录制
        }
    }
}

http {
    server {
        listen 8080;

        location / {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /opt/hls/live;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
            rewrite ^/tv\.m3u8$ /index.m3u8 break;  # 简化访问URL
        }
    }
}

关键点

  • RTMP 监听 1935 端口(用于接收推流)
  • HTTP 监听 8080 端口(用于HLS播放)
  • HLS 切片存储在 /opt/hls/live
  • 访问 http://IP:8080/tv.m3u8 可直接播放

2. 推流方法(使用 FFmpeg)

ffmpeg -re -i input.mp4 \
       -c:v libx264 -preset fast -crf 23 \
       -c:a aac -b:a 128k \
       -f flv "rtmp://SERVER_IP/tv/STREAM_KEY"

参数说明

  • -re:按输入文件的原速度推流(避免过快)
  • -c:v libx264:视频编码为 H.264
  • -c:a aac:音频编码为 AAC
  • -f flv:输出格式为 FLV(RTMP 标准格式)
  • rtmp://SERVER_IP/tv/STREAM_KEY
  • SERVER_IP:Nginx 服务器 IP
  • tv:Nginx 配置中的 application 名称
  • STREAM_KEY:自定义流名称(如 test

示例

ffmpeg -re -i movie.mp4 -c:v libx264 -c:a aac -f flv rtmp://192.168.1.100/tv/livestream

3. 接收/播放 HLS 流

播放地址

http://SERVER_IP:8080/tv.m3u8

支持的播放方式

  1. 浏览器(支持 HLS 的播放器,如 hls.js)
  2. VLC / FFplay
   ffplay http://192.168.1.100:8080/tv.m3u8
  1. 手机/平板(iOS/Android 的 HLS 兼容播放器)

4. 常见问题排查

问题检查方法
推流失败ffprobe rtmp://SERVER_IP/tv/STREAM_KEY 是否卡住?
HLS 无输出ls /opt/hls/live/ 是否有 .ts.m3u8 文件?
Nginx 未启动ps aux | grep nginx 检查进程
端口未开放netstat -tulnp | grep 1935curl http://localhost:8080/stat

最终流程总结

  1. 启动 Nginx RTMP 服务器(Docker 或直接运行)
  2. 推流
   ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://IP/tv/stream1
  1. 播放
  • 浏览器打开 http://IP:8080/tv.m3u8
  • ffplay http://IP:8080/tv.m3u8

这样,您就搭建了一个完整的 HLS 直播推流服务器! 🚀

Comments

  1. Owner
    2 weeks ago
    2025-5-21 21:35:55

    RTMP 推流HLS 播放 的关系,这里做一个清晰的解释:

    1. RTMP 推流路径 vs. HLS 播放路径

    • 推流地址(FFmpeg 使用):

      rtmp://192.168.1.100/tv/livestream
      • tv:对应 Nginx 配置中的 application 名称(必须一致)
      • livestream:自定义的流名称(可任意修改,如 test123
    • 播放地址(HLS 访问):

      http://192.168.1.100:8080/tv.m3u8
      • 由于配置中设置了 hls_nested off + rewrite 规则,无论推流时的流名称是什么,HLS 播放地址始终是固定的 tv.m3u8

    2. 为什么 livestream 不影响 HLS 播放?

    在您的 Nginx 配置中,关键设置如下:

    application tv {
        hls_nested off;  # 禁用嵌套目录结构
        # 其他配置...
    }
    
    location / {
        rewrite ^/tv\.m3u8$ /index.m3u8 break;  # 强制重写到 index.m3u8
    }
    • hls_nested off:HLS 切片会直接生成在 /opt/hls/live/ 下,文件名为 index.m3u8xxx.ts(而不是 /livestream/index.m3u8)。
    • rewrite 规则:将用户请求的 tv.m3u8 重定向到实际的 index.m3u8

    因此,无论推流时用的是 rtmp://.../tv/livestream 还是 rtmp://.../tv/abc123,最终 HLS 访问地址都是 http://IP:8080/tv.m3u8

    3. 如果需要流名称关联(动态 HLS 地址)

    如果希望播放地址与流名称关联(如 http://IP:8080/livestream.m3u8),需修改配置:

    application tv {
        hls on;
        hls_path /opt/hls/live;
        hls_nested on;  # 启用嵌套目录结构
    }
    
    location /hls {
        root /opt/hls/live;
        # 直接按流名称访问,如 /hls/livestream/index.m3u8
    }

    此时:

    • 推流地址rtmp://IP/tv/livestream
    • 播放地址http://IP:8080/hls/livestream/index.m3u8

    4. 总结

    场景
    推流地址
    播放地址
    必要条件

    固定 HLS 地址
    rtmp://IP/tv/任意名称
    http://IP:8080/tv.m3u8
    hls_nested off + rewrite 规则

    动态 HLS 地址
    rtmp://IP/tv/livestream
    http://IP:8080/hls/livestream/index.m3u8
    hls_nested on

    当前配置属于 固定 HLS 地址 方案,因此 livestream 不会影响播放地址。如果需要动态关联流名称,需调整配置。

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next