树莓派使用 HLS 实现视频流直播
说明
这次介绍一下基于上一篇文章“树莓派编译安装 FFmpeg ”的应用,即 HLS 视频流直播。原理是 FFmpeg 将 USB 摄像头的原始视频流压缩为 H.264 视频流,然后使用 FFmpeg 的 hls 切片工具将视频流分为 n 个切片和 1 个 m3u8 文件,具体原理可以看这篇文章。
准备工作
树莓派一个(1 至 3 代都可以)
USB摄像头一个
已连接到网络
步骤
将树莓派接上 USB 摄像头,lsusb 命令可以查看摄像头型号等信息,同时 /dev 目录下会多出来一个 video0 设备。在树莓派中安装 Web 服务器,考虑到树莓派的性能,此次选用 nginx 。
sudo apt-get update
sudo apt-get install nginx
默认 nginx 的网站根目录是在 /var/www/html ,为了方便,我们可以把根目录改为 /var/www ,修改 /etc/nginx/sites-available 的 default 文件,将 root /var/www/html; 修改为 root /var/www; ,然后进入 /var/www 目录,将 html 文件夹内的 index.nginx-debian.html 移到此目录,然后重启 nginx 服务。
cd /var/www;
sudo mv html/index.nginx-debian.html index.html
sudo rm -r html
sudo service nginx restart
HLS 不断将视频切片,循环写入设定的 n 个文件,长时间的反复写入可能会造成 SD 卡损坏,因此最好划分一个 16M 的内存空间用于存放切片文件。在 /var/www 目录下创建 hls 文件夹,修改 /etc/fstab 文件,添加一项内容如下:
tmpfs /var/www/hls tmpfs defaults,size=16M 0 0
重启树莓派,输入 df -h 命令后可以看到已经如下所示,说明挂载 tmpfs 到 /var/www/hls 成功。
tmpfs 16M 0 16M 0% /var/www/hls
在当前目录即 /home/pi 创建 hls.sh 文件,写入以下内容,其中 -r 10 代表帧率为 10 ,-s 640x480 代表分辨率,-b:v 300k 代表视频码率,c:v h264_omx 代表使用树莓派的 omx 硬件编码器,-segment_time 2 代表每个切片 2 秒,-segment_wrap 3 代表切片数量为 3 ,-segment_list_size 3 代表缓冲文件数量为 3 ,最后将切片的文件放到 /var/www/hls 目录并生成 stream.m3u8 。
ffmpeg -f v4l2 -r 10 -s 640x480 -i /dev/video0 -b:v 300k -c:v h264_omx -an -f segment -segment_time 2 -segment_wrap 3 -segment_list_size 3 -segment_list "/var/www/hls/stream.m3u8" "/var/www/hls/stream%03d.ts"
执行 hls.sh
chmod +x hls.sh
./hls.sh
使用支持 html5 的浏览器就可以看到视频流的内容,链接为:树莓派IP/hls/stream.m3u8
总结
使用树莓派的硬件编码器的效果很明显,基本不占用 CPU 的使用率。而此次使用的 HLS 是目前 html5 中能直接使用的直播视频流协议,优点是穿透性好,有网络的情况下都可以使用,而缺点很明显,视频的延时是很大的,按上文的设置也有至少 6s 的延时。期待更加好用的 WebRTC 协议能尽快普及。
树莓派使用 HLS 实现视频流直播的更多相关文章
- 视频流协议HLS与RTMP 直播原理 点播原理
小结: 1.HLS原理 视频--->图像.声音分别编码打包切割容器文件ts,建立纯文本索引文件.m3u8--->播放器http下载容器文件.索引文件,播放,下载 基于HLS可以实现直播和点 ...
- [原创]直播服务器简单实现 http_flv和hls 内网直播桌面
直播都不陌生了,如今主流的协议分析的对比图,个人见解. 协议 httpflv rtmp hls dash 传输层 http流 tcp流 http http 视频格式 flv flv tag Ts文件 ...
- EasyNVR无插件播放HLS/RTMP网页直播方案前端完善:监听表单变动
在上一篇博客中我们表述完了防止提交成功后多余操作提交的一个过程:其中的精髓在于ajax的触发事件的使用. 而这篇博客主要想说明一下如何实时的判断出表单是否发生变化. 问题表述: 在网页前端的开发过程中 ...
- EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出
本文转自:http://www.cnblogs.com/babosa/p/6033039.html EasyHLS EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简 ...
- 直播协议的选择:RTMP vs. HLS
文章转自:直播协议的选择:RTMP vs. HLS 前言 随着直播业务的兴起,越来越多的直播平台开始涌现,这火热的程度好像一个应用不带上直播业务出来都不好意思跟人打招呼.想要做一个直播业务,主要包括三 ...
- 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务
在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...
- (转)HLS协议,html5视频直播一站式扫盲
本文来自于腾讯bugly开发者社区,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直播这么火,再不学就 ou ...
- 使用ffmpeg搭建HLS直播系统
[时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment] 0 引言 本文作为HLS综述的后续文章. ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器的视频直播录像、检索、回放方案
需求背景: 近期遇到客户反馈对于直播摄像机录像功能是有一定的需求点的,其实EasyDarwin团队早就研发出对应功能,只是用户对于产品没有足够了解,因此本篇将对录像功能来做一次介绍. 首先,录像就是对 ...
随机推荐
- 11-15SQLserver基础--数据库之范式理论
数据库的设计理论与思路 在设计数据库的时候,有一个著名的设计理论---范式理论. 1.内容: 第一范式:每一列的数据类型要单一,必须要统一: 第二范式:在设计主键的时候,主键尽量更能体现表中的数据信息 ...
- DAY9-python并发之多线程
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python ...
- JavaSwing文件选择器 JFileChooser的使用
先看效果吧! 说明:选择文件或者文件夹.本例子就直接在控制台输出文件或者文件夹的路径.实际开发中,就可以将文件或文件夹的路径封装为File的实例来使用了. package test; import j ...
- schedule与scheduleAtFixedRate比较
schedule与scheduleAtFixedRate: 不延时: schedule(TimerTask, Date runDate, long period)方法任务不延时----Date类型 i ...
- Struts2 看1
Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前 ...
- head first 设计模式 观察者模式
Head first 设计模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 让主题与观察者之间松耦合 大话设计模式:定义了一种一对多的依赖关 ...
- python 获取路径不同方法的比较
在软件中经常需要获取文件所在路径,方法有很多种( 例如 os.path.realpath(__file__), os.getcwd(), os.path.abspath(__file__), sys ...
- 5.Qt model view设计模式
Introduction to Model/View Programming QT4 介绍了一系列新的 Item View 类,这些类使用Model/View结构来管理数据和数据如何呈现给 ...
- Flask框架 之 基本使用
初识Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求 ...
- 多线程学习-基础(十三)(学习参考·网摘) ArrayBlockingQueue源代碼解析(base jdk 1.8)
前记: 这个得首先声明一下,以下大部分内容均参考于:https://blog.csdn.net/wx_vampire/article/details/79585794,本随笔只作为学习作用,侵权删! ...