[Unity] 播放摄像头的实时视频
2022-05-22 本文已影响0人
_Walker__
环境
- Unity 2020.3.25f1
- ffmpeg-5.0.1-full_build.zip
- NexPlayer - Video Streaming Player with DRM (Free Demo)
- Python 3.7.9
1、视频流
这里用ffmpeg-5.0版本,将rtsp视频流转换为hls格式的m3u8列表
网上找的可用rtsp视频地址:rtsp://admin:12345@183.167.229.111:554/Streaming/Channels/102/?transportmode=unicast
ffmpeg -re -i rtsp://admin:12345@183.167.229.111:554/Streaming/Channels/102/?transportmode=unicast -c copy -f hls -hls_flags delete_segments -hls_time 1 -hls_list_size 5 -hls_segment_filename cache\live%05d.ts cache\live.m3u8
上面的命令,将rtsp视频转码为hls并存储到本地的cache目录下
Python用途只是提供一个简单的http服务器,可以通过http协议访问到转码生成的m3u8文件
# 先将目录切换到存储m3u8的cache目录下,启动Http服务器绑定8080端口
python -m http.server 8080
服务启动后,可通过 http://127.0.0.1:8080/live.m3u8 访问到视频
2、Unity播放视频
组件设置在Canvas下创建一个RawImage组件,绑定到Nex Player Render Controller组件上。然后按上图框出的选项设置,Play即可播放实时视频。
播放内容3、用本地摄像头提供视频流
:: 摄像头推流
ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv
:: 从本地摄像头产生HLS视频流
ffmpeg -f dshow -i video="HP Wide Vision HD Camera" -vcodec libx264 -preset:v ultrafast -f hls -hls_flags delete_segments -hls_time 0.1 -hls_list_size 5 -hls_segment_filename cache\live%05d.ts cache\live.m3u8
开始结合"摄像头推流"跟上面“rtsp转码”的命令,确实生成了从摄像头的来的HLS视频流。但在Unity中访问时引擎卡死了!!!用PotPlayer确认得到的m3u8文件没有问题,只能怀疑视频编码上存在差异。
还是借助PotPlayer来对比编码信息,发现视频像素格式有差异。本地摄像头录制出来的是 yuvj224p
,而从远程rtsp拿到的是 NV12
。
于是在转码过程中加上对NV12的支持 -pix_fmt nv12
最终测试通过~~
:: 最终命令
ffmpeg -f dshow -i video="HP Wide Vision HD Camera" -vcodec libx264 -preset:v ultrafast -pix_fmt nv12 -f hls -hls_flags delete_segments -hls_time 0.1 -hls_list_size 5 -hls_segment_filename cache\live%05d.ts cache\live.m3u8