1. 环境准备搭建Nginx-RTMP服务器第一次接触直播服务器搭建时我对着命令行界面手足无措的样子还历历在目。现在回头看其实用Nginx搭建RTMP服务器就像组装乐高积木只要按步骤来就能成功。这里我推荐在Ubuntu系统上操作对新手最友好。先来安装必要的依赖库打开终端挨个执行这些命令sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev接着下载Nginx和RTMP模块源码包建议创建专门目录存放mkdir ~/rtmp_server cd ~/rtmp_server wget http://nginx.org/download/nginx-1.25.3.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.3.tar.gz解压后进入nginx目录开始编译关键是要带上--add-module参数tar -zxvf nginx-1.25.3.tar.gz tar -zxvf v1.2.3.tar.gz cd nginx-1.25.3 ./configure --prefix/usr/local/nginx --add-module../nginx-rtmp-module-1.2.3 --with-http_ssl_module make -j4 sudo make install编译时如果报错缺少依赖根据提示用apt-get安装对应库就行。我遇到过最头疼的问题是权限不足建议全程用sudo执行。2. 配置RTMP服务参数安装完成后打开配置文件进行修改sudo vim /usr/local/nginx/conf/nginx.conf在文件末尾追加这段RTMP配置注意缩进rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; # 推流鉴权配置可选 # on_publish http://yourserver.com/auth; # 自适应码率配置 # exec_static ffmpeg -i rtmp://localhost/live/$name # -c:v libx264 -preset veryfast -g 10 -b:v 800k # -c:a aac -b:a 64k -f flv rtmp://localhost/live360p/$name; } # 多码率转码示例 application live360p { live on; record off; } } }保存后启动服务sudo /usr/local/nginx/sbin/nginx验证服务是否正常运行netstat -tulnp | grep nginx # 应该看到1935端口监听3. Android端推流实现在Android Studio项目中首先在build.gradle添加推流库依赖implementation com.github.pedroSG94.rtmp-rtsp-stream-client-java:rtplibrary:2.2.5然后处理相机和音频权限AndroidManifest.xml中声明uses-permission android:nameandroid.permission.CAMERA/ uses-permission android:nameandroid.permission.RECORD_AUDIO/ uses-permission android:nameandroid.permission.INTERNET/核心推流代码示例private RtmpCamera1 rtmpCamera; // 初始化推流器 rtmpCamera new RtmpCamera1(surfaceView, this); rtmpCamera.setReTries(3); // 设置重试次数 // 开始推流 if (rtmpCamera.prepareVideo(1280, 720, 30, 1200 * 1024, false, 90) rtmpCamera.prepareAudio()) { rtmpCamera.startStream(rtmp://your_server_ip/live/stream_key); } // 回调监听 Override public void onConnectionSuccessRtmp() { runOnUiThread(() - Toast.makeText(this, 推流成功, Toast.LENGTH_SHORT).show()); } Override public void onConnectionFailedRtmp(String reason) { runOnUiThread(() - Toast.makeText(this, 推流失败: reason, Toast.LENGTH_SHORT).show()); }4. 常见问题排查指南问题1Nginx启动报地址被占用可能是默认80端口冲突修改nginx.conf中的http模块listen端口问题2Android端连接超时检查服务器防火墙是否开放1935端口sudo ufw allow 1935/tcp问题3视频画面旋转在prepareVideo方法中调整第6个参数0/90/180/270实测90度最常用问题4音频不同步尝试调整关键帧间隔rtmpCamera.prepareVideo(width, height, fps, bitrate, false, 90); // 第三个参数fps建议设为30问题5高延迟优化在nginx配置中添加rtmp { server { ... ping 30s; notify_method get; buflen 300ms; } }5. 进阶功能实现多分辨率转码使用FFmpeg动态转码需服务器安装ffmpegapplication live { exec_static ffmpeg -i rtmp://localhost/live/$name -c:v libx264 -preset ultrafast -s 640x360 -b:v 800k -g 60 -c:a aac -b:a 64k -f flv rtmp://localhost/live360p/$name; }推流鉴权添加on_publish回调验证on_publish http://yourserver.com/auth_stream;HLS协议支持在nginx配置中添加application live { hls on; hls_path /tmp/hls; hls_fragment 3s; hls_playlist_length 60s; }带宽自适应Android端动态调整码率rtmpCamera.setVideoBitrateOnFly(500 * 1024); // 动态调整为500kbps6. 性能优化建议编码参数调优使用preset ultrafast降低编码延迟关键帧间隔设为2秒GOP帧率×2网络自适应策略// 网络状态监听 rtmpCamera.setNetworkStatusListener((delay, lost) - { if (lost 0.2) { // 丢包率超过20% rtmpCamera.setVideoBitrateOnFly(currentBitrate * 0.8); } });硬件加速配置// 启用硬件编码 rtmpCamera.prepareVideo(1280, 720, 30, 1200*1024, true, // 硬件编码 90);后台服务保活// 在Service中创建Notification保持前台服务 startForeground(NOTIFICATION_ID, buildNotification());记得在推流结束后释放资源Override protected void onDestroy() { super.onDestroy(); if (rtmpCamera ! null) { rtmpCamera.stopStream(); rtmpCamera null; } }