如何通过Nginx将RTSP IP摄像头流推送到网站并解决FFmpeg推流报错
解决方案
1. 修复FFmpeg推流报错
报错的核心原因是你错误指定了输出格式为mp4:MP4封装要求输出目标支持随机写入(补写头部元数据),而RTMP是流式传输协议不支持seek操作,因此触发报错。
将输出格式改为RTMP适配的flv即可,修正后命令如下:
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip-camera:554/h264Preview_01_main -vcodec copy -acodec aac -f flv rtmp://ip-address:1935/live/cam
注:如果摄像头原流音频格式为非AAC编码,不能直接用-acodec copy,浏览器不支持HLS流携带除AAC外的音频格式,必须转码为AAC。
2. 修复HTML视频源配置错误
你当前配置的type="application/x-mpegURL"对应HLS流媒体协议,浏览器原生不支持直接播放RTMP地址,需改为Nginx生成的HLS索引文件地址:
<source src="http://ip-address/hls/cam.m3u8" type="application/x-mpegURL" />
3. 补充Nginx必要配置
你需要先给Nginx编译安装nginx-rtmp-module模块,再添加如下配置实现RTMP流转HLS切片:
rtmp { server { listen 1935; application live { live on; # 开启HLS切片 hls on; hls_path /usr/share/nginx/html/hls; hls_fragment 2s; hls_playlist_length 10s; } } } http { server { listen 80; # 配置HLS文件访问规则 location /hls { root /usr/share/nginx/html; add_header Access-Control-Allow-Origin *; types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } } } }
4. 为什么写入MP4文件无法实时读取
MP4文件的元数据默认存储在文件尾部,FFmpeg未完成整个文件写入并关闭句柄前,元数据不完整,播放器无法正常解析文件内容。实时直播场景不要使用本地MP4文件中转的方案,HLS/WebRTC是更适配的技术方案。
内容的提问来源于stack exchange,提问作者Vepok
相关产品推荐
相关产品推荐

