unity

[Unity] 播放摄像头的实时视频

2022-05-22  本文已影响0人  _Walker__

环境

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


参考文章
ffmpeg推流拉流的几种方式
FFmpeg之mp4转nv12(yuv420)(十二)

上一篇 下一篇

猜你喜欢

热点阅读