说明

这次介绍一下基于上一篇文章“树莓派编译安装 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 实现视频流直播的更多相关文章

  1. 视频流协议HLS与RTMP 直播原理 点播原理

    小结: 1.HLS原理 视频--->图像.声音分别编码打包切割容器文件ts,建立纯文本索引文件.m3u8--->播放器http下载容器文件.索引文件,播放,下载 基于HLS可以实现直播和点 ...

  2. [原创]直播服务器简单实现 http_flv和hls 内网直播桌面

    直播都不陌生了,如今主流的协议分析的对比图,个人见解. 协议 httpflv rtmp hls dash 传输层 http流 tcp流 http http 视频格式 flv flv tag Ts文件 ...

  3. EasyNVR无插件播放HLS/RTMP网页直播方案前端完善:监听表单变动

    在上一篇博客中我们表述完了防止提交成功后多余操作提交的一个过程:其中的精髓在于ajax的触发事件的使用. 而这篇博客主要想说明一下如何实时的判断出表单是否发生变化. 问题表述: 在网页前端的开发过程中 ...

  4. EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出

    本文转自:http://www.cnblogs.com/babosa/p/6033039.html EasyHLS EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简 ...

  5. 直播协议的选择:RTMP vs. HLS

    文章转自:直播协议的选择:RTMP vs. HLS 前言 随着直播业务的兴起,越来越多的直播平台开始涌现,这火热的程度好像一个应用不带上直播业务出来都不好意思跟人打招呼.想要做一个直播业务,主要包括三 ...

  6. 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务

    在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...

  7. (转)HLS协议,html5视频直播一站式扫盲

    本文来自于腾讯bugly开发者社区,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直播这么火,再不学就 ou ...

  8. 使用ffmpeg搭建HLS直播系统

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment] 0 引言 本文作为HLS综述的后续文章. ...

  9. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器的视频直播录像、检索、回放方案

    需求背景: 近期遇到客户反馈对于直播摄像机录像功能是有一定的需求点的,其实EasyDarwin团队早就研发出对应功能,只是用户对于产品没有足够了解,因此本篇将对录像功能来做一次介绍. 首先,录像就是对 ...

随机推荐

  1. Java was started but returned exit code=13 问题解决

    我在安装完jdk后,也对环境进行了配置,且环境的配置是没有问题的.最后我下载了eclipse,然后打开之后就发现了以下图所示的错误: Java was started but returned exi ...

  2. dp-矩阵连乘

    参考:http://blog.csdn.net/liufeng_king/article/details/8497607 使用备忘录算法复杂度降至O(n^3) #include<stdio.h& ...

  3. Android常用开源库集合【持续更新】

    1.FastJson  阿里巴巴工程师做的一个方便的JSON转换库 2.ButterKnife 只要作用能代替代码中大量的findviewbyid语句的使用,使用@injectview注入方式 3.v ...

  4. php命令行操作

    1.php -v返回版本 -i选项返回安装的有关信息 -h访问帮助文件 -m列出编译到当前PHP安装的全部模块   CLI与CGI区别: 在命令行脚本环境中,有两种版本的PHP可以使用,旧版本是CGI ...

  5. C++字符串流保存数据

    文件流是以外存文件为输入输出对象的数据流.字符串流是以内存中用户定义的字符数组(字符串)为输入输出对象的. 建立输出字符串流: ostrstream strout(c,sizeof(c));第一个参数 ...

  6. hibernate里的实体类中不能重写toString

    @Test报堆栈溢出,   在main中报错toString

  7. 华为JAVA机试流程

    1.JAVA机试流程:①打开IE浏览器,输入机试系统IP地址(以当天告知的地址为准):②输入姓名.手机,选择“C/C++”或“JAVA”,登录:③登录后显示题目,阅读题目并点击页面最下方的“下载框架文 ...

  8. Luogu 1484 种树

    Luogu 1792 算是双倍经验. 我们考虑对于一个点,我们要么选它,要么选它周围的两个点. 所以我们考虑用一个堆来维护,每次从堆顶取出最大值之后我们把它的权值记为:它左边的权值加上它右边的权值减去 ...

  9. CSS相关知识和经验的碎片化记录

    1.子DIV块中设置margin-top时影响父DIV块位置的问题 解决办法1:若子DIV块中使用margin-top,则在父DIV块中添加:overflow:hidden; 解决办法2:在子DIV块 ...

  10. Servlet对象生命周期(四)

    一.Servlet对象生命周期 一下图片说明上图第7点 destroy()方法是在停止tomcat服务器时执行 https://pan.baidu.com/s/1mgTabWW#list/path=% ...