流媒体之从零实现搭建简单流媒体服务器,推流,拉流播放全景视频

一、直播与点播

  • 直播:在我的理解中是实时录制的内容,类似各个晚会的实时直播过程,在现场采集图像的同时传输影像到网络上。
  • 点播:是提前录制完成的内容,类似某些直播平台上根据观众的需求播放某些电影或经典电视剧。终端看到的内容是编辑好的视频文件,不是实时录制的。

本篇文章实现的功能就类似是点播,将本地的全景视频通过服务器传输到各个客户端。

二、实现直播或点播的关键步骤

1、搭建及配置流媒体服务器 ;
2、推流,将本地视频或直播视频以流媒体的形式推送给流媒体服务器 (可能会涉及格式转换);
3、拉流 ,从服务器中将流媒体下载到本地并播放,一般是边下载边播放的过程。

三、具体实现步骤

在搭建流媒体服务器之前需要了解在拉流时我们需要用到哪种协议;目前比较主流的流协议有:RTMP、RTSP及HLS ,其中前两种协议多用于PC,HLS可以很好的支持Android、IOS端。
为了更好的支持手机端观看,我选择的是HLS协议,该协议规定 视频的封装格式为TS,除了TS视频文件本身,还定义了用来控制播放的m3u8文件。
而流媒体做推流时一般会用到RTMP协议,由此本文中推流使用RTMP协议,拉流使用HLS协议。

1. 搭建Windows系统下的nginx流媒体服务器。

网上很多资料是基于linux搭建流媒体服务器,由于本人对服务器相关技术一窍不通,所以选择了尝试在windows系统下直接搭建流媒体服务器。
此处参考如下大神整理的步骤:
Windows下的nginx流媒体服务器搭建过程

2、推送本地视频到流媒体服务器

目前有两种比较主流的推流应用程序:FFmpeg 及 OBS statio

  1. FFmpeg推流 :在大神整理的流媒体服务器搭建过程中有涉及到使用 ffmpeg 中的相关
    命令对本地视频进行推送;
    ①ffmpeg.exe -re -i “a.mp4” -acodec aac -ar 32000 -vcodec copy -f flv “rtmp://193.156.0.56/live/test1”
    以上命令,是需要将本地视频放置在ffmpeg的安装路径之下的,且输入命令时需要定位到该路径下,如下图所示。
    在这里插入图片描述
    在这里插入图片描述

② ffmpeg -re -i C:\Users\15248\Desktop\a.mp4 -c copy -f flv rtmp://193.156.0.56/live/test1
以上命令适用于为ffmpeg 配置好了系统环境,且视频放在对应路径(将视频拖到命令窗口即可)。

(2)OBS 推流
OBS是免费且开源的视频录制以及直播推流的软件,广泛使用于视频采集,直播等领域,且支持多种不同的语言界面,操作非常直观方便。
在这里插入图片描述

该软件功能强大,我只是用于本地视频推流,将本地视频添加至工作台,配置好服务器开始推流即可;
在这里插入图片描述
更多关于OBS软件的功能可以自行了解。

以上两种方法都可以实现将本地视频以流媒体的形式推送到流媒体服务器,且都使用了RTMP协议。

三、拉流及本地视频播放

本地的拉流的实现我是在unity中使用AVPro插件实现的,由于目前AVPro支持HLS协议,且将会应用于手机端,因为拉流选用HLS协议,具体设置如图所示:
在这里插入图片描述
之后发布安卓端,PC端,均测试成功,实现了边拉流边播放的功能。

写在最后

个人理解,无论是直播还是点播的过程,并不存在真正意义上的暂停操作,只存在直播时长的问题,点播可以通过OBS控制本地视频暂停播放的操作实现推流画面的暂停,看起来好像是视频播放暂停了,但其实推流及拉流一直在进行,只不过一直推流和拉流的画面在暂停画面时,一直是一样的。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要从全景图片中生成视频,您需要使用图像处理和计算机视觉技术,以及视频编码知识。以下是可能的实现步骤: 1. 将全景图像切割成多个覆盖相机的子图像。这些子图像可以是球面、柱面或立方体投影。 2. 对每个子图像应用图像拼接算法,将其转换为平面图像。这些平面图像将是您生成视频的帧。 3. 将帧序列编码为视频格式,如MP4或AVI。 以下是一个示例Python代码,该代码使用OpenCV库实现全景图像到视频的转换: ```python import cv2 import numpy as np # 读入全景图像 panorama = cv2.imread('panorama.jpg', cv2.IMREAD_COLOR) # 将全景图像切割成多个子图像,这里使用立方体投影 # 具体实现可以使用OpenCV的cv2.CubeMap或cv2.CubeMapCamera # 进行立方体投影,也可以使用其他库或算法实现 sub_images = cube_map_projection(panorama) # 对每个子图像进行图像拼接,生成平面图像 # 具体实现可以使用OpenCV的cv2.stitcher或cv2.createStitcher # 进行图像拼接,也可以使用其他库或算法实现 plane_images = stitch_images(sub_images) # 将平面图像序列编码为视频 # 具体实现可以使用OpenCV的cv2.VideoWriter或FFmpeg # 进行视频编码,也可以使用其他库或算法实现 video_writer = cv2.VideoWriter('panorama.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (640, 480)) for image in plane_images: video_writer.write(image) video_writer.release() ``` 需要注意的是,具体的实现方式会因为数据类型和算法的不同而有所差异,上述代码仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值