树莓派经服务器向移动端(安卓/iOS)推送HLS直播流的技术问询
Hey there! 既然你已经搞定了局域网内树莓派到安卓的直播流传输,那公网中转的核心逻辑就是把链路改成「树莓派→公网中转服务器→安卓设备」,用成熟的流媒体协议完成流的推送与拉取。下面我分步骤给你拆解具体实现:
一、先搞定中转服务器的基础配置
- 你需要一台带公网IP的云服务器(轻量应用服务器就行,低配置完全够用)
- 安装nginx-rtmp-module作为流媒体中转服务,它轻量、配置简单,完美适配RTMP/HLS这类直播协议:
- 先安装nginx,再编译加入rtmp模块(或者直接用带rtmp的预编译包)
- 修改nginx配置文件(
nginx.conf),在http代码块外添加RTMP服务配置:rtmp { server { listen 1935; # RTMP默认端口,必须在服务器防火墙+安全组开放 chunk_size 4096; application live { live on; # 开启直播模式 hls on; # 开启HLS模式,适配移动端拉流 hls_path /usr/local/nginx/html/hls; # 存放HLS切片的路径,需提前创建并赋权 hls_fragment 5s; # 切片时长,数值越小延迟越低 hls_playlist_length 15s; # 播放列表保留的切片数量 } } } - 重启nginx服务,确保RTMP模块正常运行
二、树莓派端推流到中转服务器
- 你之前应该已经用
raspivid+ffmpeg做过局域网推流,现在只需要把推流目标地址改成中转服务器的公网IP即可:
原来的局域网推流命令大概是这样:
现在替换成中转服务器的公网地址:raspivid -o - -t 0 -w 1280 -h 720 -fps 25 | ffmpeg -i - -vcodec copy -acodec aac -f flv rtmp://局域网安卓IP/live/streamraspivid -o - -t 0 -w 1280 -h 720 -fps 25 | ffmpeg -i - -vcodec copy -acodec aac -f flv rtmp://你的服务器公网IP/live/stream - 注意:要确认树莓派能ping通服务器,同时服务器的1935端口(RTMP)和80端口(HLS拉流用)已经完全开放
三、安卓端从中转服务器拉取流
- 安卓端推荐用ExoPlayer播放,它对RTMP/HLS的兼容性都很好:
- 如果追求兼容性优先(适合多数安卓设备),用HLS协议,拉流地址是:
http://你的服务器公网IP/hls/stream.m3u8(这里的stream要和树莓派推流命令里的最后一段路径一致) - 核心代码示例:
// 初始化ExoPlayer SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); playerView.setPlayer(player); // 构建HLS媒体源并播放 MediaItem mediaItem = MediaItem.fromUri("http://你的服务器公网IP/hls/stream.m3u8"); player.setMediaItem(mediaItem); player.prepare(); player.play(); - 如果追求低延迟(1-3秒左右),可以用RTMP协议,拉流地址是
rtmp://你的服务器公网IP/live/stream,但需要给ExoPlayer添加RTMP扩展库支持
- 如果追求兼容性优先(适合多数安卓设备),用HLS协议,拉流地址是:
四、常见问题排查
- 树莓派推流失败:检查服务器公网IP是否正确、端口是否开放、nginx的RTMP配置有无语法错误,以及树莓派能否正常访问公网
- 安卓端拉流卡顿:可以降低树莓派的推流分辨率/帧率,或者把HLS切片时长调小(比如改成3s),同时确保服务器带宽足够
- 延迟过高:HLS本身是HTTP切片协议,延迟在10-20秒属于正常;如果要更低延迟,优先选RTMP,也可以尝试SRT协议(稳定性更好,但配置稍复杂)
内容的提问来源于stack exchange,提问作者Dany Y
相关产品推荐
相关产品推荐

