树莓派使用 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团队早就研发出对应功能,只是用户对于产品没有足够了解,因此本篇将对录像功能来做一次介绍. 首先,录像就是对 ...
随机推荐
- leetcode590
树的后序遍历. class Solution { public: vector<Node> Tree; void postTree(Node node) { for (auto n : n ...
- windows 修改端口数据及连接时间
最近线上遇到windows机器访问其他机器的时候失败的情况.实际就是本地的端口不够用造成的. D:\>netsh interface ipv4 show dynamicportrange pro ...
- sizeof总结
1.sizeof常用总结 ①与strlen比较 strlen 计算字符串的字符数,以"\0"为结束判断,但不统计结束符. sizeof 计算数据(数组.变量.类型. ...
- PHP同时连接多个数据库
PHP同时连接多个mysql数据库的具体实现 方法一: <?php $conn1 = mysql_connect("127.0.0.1", "root", ...
- 高并发压力测试工具Locust(蝗虫)
What is Locust? Locust is an easy-to-use, distributed, user load testing tool. It is intended for lo ...
- 一堵墙IFC数据-wall.ifc
这是一面墙的IFC数据内容 =====================================文档内容======================================= ISO-1 ...
- python3-列表中存储字典
# Auther: Aaron Fan #示例1:#定义几个字典alien_0 = {"color":"green", "points":5 ...
- 有趣的setTimeout
今天在回顾JavaScript进阶用法的时候,发现一个有趣的问题,话不多说,先上代码: for(var j=0;j<10;j++){ setTimeout(function(){console. ...
- net core 使用 SqlSugar
/// <summary> /// SqlSugar 注入Service的扩展方法 /// </summary> public static class SqlSugarSer ...
- 个人JS体系整理(二)
一. eval eval()函数计算JavaScript字符串,并把它作为脚本代码来执行.如果参数是一个表达式,eval()函数将执行表达式.如果参数是Javascript语句,eval()将执行Ja ...