草庐IT

ZLMediaKit视频推流和播放步骤

ywxuan 2023-08-11 原文

记录一下使用ZLMediaKit轻量级流媒体服务器进行视频推流和播放的步骤,以免后期遗忘:

一、首先要开启ZLMediaKit流服务器,或者启动带rtmp的nginx,这里采用第一种方案
cd ZLMediaKit编译后的执行文件目录
./MediaServer -d &                #后台启动ZLMediaKit
Postman 2>&1 &                    #启动Postman,用于添加流代理

二、在Postman中添加流代理
在Postman中加载ZLMediaKit的链接配置,切换到添加流代理命令卡,执行添加流代理命令,其中
secret: 在本机上使用默认secret
vhost: 在本机上使用默认vhost "__defaultVhost__"
app: "live"
stream: "test"
url: "rtmp://127.0.0.1:1935/test/video"
enable_rtsp: true
enable_rtmp: true
enable_hls: true
执行该命令后,ZLMediaKit将从rtmp://127.0.0.1:1935/test/video中获取源视频,并从ZLMediaKit配置文件中规定的端口地址推流出去,rtmp地址为rtmp://127.0.0.1:1935/live/test,  rtsp的地址是rtsp://127.0.0.1:8554/live/test

三、推流
1、从摄像头推流命令:
1) gstreamer推流:gst-launch-1.0 v4l2src device=/dev/video0 ! 'video/x-raw, width=1280, height=720, framerate=10/1' ! queue ! videoconvert ! x264enc ! h264parse ! flvmux ! rtmpsink location=rtmp://127.0.0.1:1935/test/video
2) ffmpeg推流:ffmpeg -re -f video4linux2 -s 1280x720 -i /dev/video0  -vcodec libx264 -f flv  -y rtmp://127.0.0.1/test/video

2、从文件推流命令:
1) gstreamer推流:gst-launch-1.0 filesrc location=xxx.mp4 ! qtdemux name=d d.video_0 ! h264parse ! flvmux ! rtmpsink location=rtmp://127.0.0.1:1935/test/video
2) ffmpeg推流: ffmpeg -re -stream_loop -1 -i xxx.mp4 -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/test/video

四、播放
gstreamer播放:gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1:8554/live/test protocols=4 ! rtph264depay !  h264parse ! avdec_h264 ! videoconvert ! xvimagesink
ffplay播放:ffplay -i rtsp://127.0.0.1:8554/live/test

五、在浏览器中播放
在浏览器中播放需要用到video.js和videojs-contrib-hls这两个插件,而这两个插件需要npm安装。由于对前端的技术不熟悉,一开始面对nodejs、npm、vue等东西一脸蒙圈,还下载了video.js和http-streaming源码试图编译:<(。折腾了好久才把这两个插件装上去。
1、安装nodejs和npm
sudo apt install nodejs npm
输入 npm -v查看到版本号,说明npm正常安装
2、安装 cnpm(淘宝镜像npm)
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
3、安装videojs和videojs-contrib-hls
进入到ZLMediaKit编译后的www文件夹,一般是 ZLMediaKit/release/linux/Debug/www
cnpm install --save video.js
cnpm install --save videojs-contrib-hls
执行完上面两条命令后,会在www目录下新增一个node_modules文件夹,里面包含了npm安装的以上两个模块。如果用npm install -g video.js,则会将video.js安装到npm的全局模块目录下(一般是/usr/local/lib/node_modules)。
4、新建一个videotest.html页面用于在浏览器显示,内容如下

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>前端播放m3u8格式视频</title>
 <!-- 这个是videojs的CDN网站,这里用本地的video.js,所以注释掉以下几行 -->
 <!--https://www.bootcdn.cn/video.js/ -->
 <!-- <link href="https://cdn.bootcdn.net/ajax/libs/video.js/7.19.0/alt/video-js-cdn.css" rel="stylesheet"> -->
 <!-- <script src="https://cdn.bootcdn.net/ajax/libs/video.js/7.19.0/alt/video.core.min.js"></script> -->
 <!--https://www.bootcdn.cn/videojs-contrib-hls/-->
 <!-- <script src="https://cdn.bootcss.com/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script> -->

  <link href="/node_modules/video.js/dist/video-js.min.css" rel="stylesheet">
  <script src="/node_modules/video.js/dist/video.min.js" charset="utf-8"></script>
  <script src="/node_modules/videojs-contrib-hls/dist/videojs-contrib-hls.min.js"></script>
</head>

<body>
 <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="1080" height="708" data-setup='{}'> 
 <!-- <source id="source" src="https://hqcrm.oss-cn-shenzhen.aliyuncs.com/cloudRecord/44a8cc12038c464f96ad204b1981ee05/3ccd283e9d42022539df549425c11d11_255547796.m3u8" type="application/x-mpegURL"> -->
  <source id="source" src="/live/test/hls.m3u8" type="application/x-mpegURL">
 </video>
</body>

<script> 
 // videojs 简单使用 
 var myVideo = videojs('myVideo',{
 bigPlayButton : true, 
 textTrackDisplay : false, 
 posterImage: false,
 errorDisplay : false,
 })
 myVideo.play() // 视频播放
 myVideo.pause() // 视频暂停
</script>

</html>

然后在浏览器中输入 http://localhost:8080/videotest.html,就可以看到正在推送的视频流了。

有关ZLMediaKit视频推流和播放步骤的更多相关文章

  1. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  2. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  3. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  4. ruby - cucumber 特征和步骤定义 - 2

    我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA

  5. ruby - 如何在 Cucumber 步骤定义中使单词可选? - 2

    我在下面有一个步骤定义,它执行我想要它执行的操作,即它根据“PAGES”哈希的“page”元素检查页面的url。Then(/^Ishould(still)?beatthe"(.*)"page$/)do|still,page|BROWSER.url.should==PAGES[page]end步骤定义用于两者我应该在...页面我应该还在...页面但是,我不需要将“still”传递到block中。我只需要它是可选的以匹配步骤但不传递到block中。我该怎么做?谢谢。 最佳答案 您想将“静止”组标记为非捕获。这是通过使用?:启动组来完成的

  6. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  7. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

  8. ruby - 如何播放 mp3 文件? - 2

    我如何用ruby​​编写一个脚本,当从命令行执行时播放mp3文件(背景音乐)?我试过了run="mplayer#{"/Users/bhushan/resume/m.mp3"}-aosdl-vox11-framedrop-cache16384-cache-min20/100"system(run)但它也不起作用,以上是播放器特定的。如果用户没有安装mplayer怎么办。有没有更好的办法? 最佳答案 我一般都是这样pid=fork{exec'mpg123','-q',file} 关于ruby

  9. ruby - 如何预期失败的步骤并传递 cucumber 中的失败? - 2

    我们想测试cucumber的步骤定义。我们希望能够检查的一件事是我们期望失败的测试实际上失败了。为此,我们想编写我们知道会失败的场景并将它们添加到我们的测试套件中,但标记或以其他方式表示它们以便当且仅当它们失败时它们“通过”。如何解决这个问题? 最佳答案 您应该测试负面状态。失败的步骤只是通过步骤的倒数。所以做这样的事情:Then/ishouldnotbetrue/dosome_value.should_notbe_trueend这就是我进行失败测试的方式。您还可以捕获异常等,并验证block是否确实抛出该异常lambdadosom

  10. ruby - ruby 方法查找中的*实际*步骤是什么? - 2

    我已经阅读了有关此主题的stackoverflow帖子以及包括APrimeronRubyMethodLookup在内的几篇文章,WhatisthemethodlookuppathinRuby.此外,我查看了RubyMetaprogramming2中的对象模型章节,在几个聊天室中询问,并做了thisredditthread。.除了学习C,我已经尽我所能来解决这个问题。如上述资源所述,这6个位置在接收对象(如fido_instance)的方法查找期间(按顺序)被检查。:fido_instance的单例类IClass(来自扩展模块)IClass(来自前置模块)类IClass(来自包含的模块)

随机推荐