FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream流
一、Windows下面编译ffmpeg
首先需要解决的问题是:在windows下面编译 ffmpeg, 并让其支持dshow, 本人把ffmpeg编译成功了, 但是编译出来的ffmpeg不支持dshow, 在网上找了有文章介绍如何编译ffmpeg让其支持dhsow, 按照文章说的方法试了N次, 终究没有成功。无奈只有找现成的windows下面的exe了。
在这里找到了可用的ffmpeg.exe, 测试了一下,支持dshow。
下载地址为: http://ffmpeg.zeranoe.com/builds/
请下载适合自己操作系统的压缩包, 我的系统是Win7 64Bit 的,所以选择的是 http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20130809-git-3b2e99f-win64-static.7z
下载解压到C盘根目录。
二、测试FFMPEG支持dshow的情况
原文出处请参考 :http://ffmpeg.org/trac/ffmpeg/wiki/DirectShow
执行下面的命令 , 即可显示你的系统支持音频捕获设备,视频捕获设备:
c:\> ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
libavutil 51. 74.100 / 51. 74.100
libavcodec 54. 65.100 / 54. 65.100
libavformat 54. 31.100 / 54. 31.100
libavdevice 54. 3.100 / 54. 3.100
libavfilter 3. 19.102 / 3. 19.102
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 16.100 / 0. 16.100
[dshow @ 03ACF580] DirectShow video devices
[dshow @ 03ACF580] "Integrated Camera"
[dshow @ 03ACF580] "screen-capture-recorder"
[dshow @ 03ACF580] DirectShow audio devices
[dshow @ 03ACF580] "Internal Microphone (Conexant 2"
[dshow @ 03ACF580] "virtual-audio-capturer"
dummy: Immediate exit requested
我们下来使用 视频捕获设备 "Integraged Camera" 保存为MP4文件:
c:\> ffmpeg -f dshow -i video="Integrated Camera" out.mp4
嘿嘿,摄像头灯亮了,文件已经输出到了和 ffmpeg.exe 相同的路径下面。 用VLC播放 out.mp4文件,正常。
用下面的命令可以查看视频捕获设备支持的图片大小等详细信息。
C:\ffmpeg\bin>ffmpeg -f dshow -list_options true -i video="Integrated Camera"
用下面的命令我们可以把视频分辨率存储为1280x720, FPS为15帧/秒, 输出为 out.avi 文件。是不是很方便啊 ?
C:\>ffmpeg -f dshow -s 1280x720 -r 15 -vcodec mjpeg -i video="Integrated Camera" out.avi
三、测试FFMPEG对DSHOW支持的另外一种方法
原文出处 : http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20capture%20a%20webcam%20input
用下面的命令我们也可以输出视频捕获设备,只不过不是名字,而是ID的形式。
ffmpeg -y -f vfwcap -i list
输出如下 :
libavutil 52. 41.100 / 52. 41.100
libavcodec 55. 24.100 / 55. 24.100
libavformat 55. 13.102 / 55. 13.102
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 82.100 / 3. 82.100
libswscale 2. 4.100 / 2. 4.100
libswresample 0. 17.103 / 0. 17.103
libpostproc 52. 3.100 / 52. 3.100
[vfwcap @ 000000000034d940] Driver 0
[vfwcap @ 000000000034d940] Microsoft WDM Image Capture (Win32)
[vfwcap @ 000000000034d940] Version: 6.1.7600.16385
list: Input/output error
从上面看出 vfwcap的索引号为0, 用下面的命令即可捕获视频数据。其中 -i 0 就代表使用ID为0的视频采集设备, -r 25代表帧率为25帧/秒
ffmpeg -y -f vfwcap -r 25 -i 0 out.mp4
四、Apple公司的HLS文件切片相关资料
原文出处为 : http://orfika.net/src/mpegts-segmenter/
下面是相关的技术资料的地址 :
MPEG TS segmenter by Chase Douglas source: http://svn.assembla.com/svn/legend/segmenter/
ffmpeg & segmenter LiveStream Howto: http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/
Apple's LiveStream docs: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/Introduction/Introduction.html
Apple's LiveStream draft at IETF: http://tools.ietf.org/html/draft-pantos-http-live-streaming-07"
ffmpeg 0.10.0 release: http://ffmpeg.org/download.html#release_0.10
Cardon McDonal's IOCANNON: http://www.ioncannon.net/
Index of /src/mpegts-segmenter/
Name | Last Modified | Size | Type |
---|---|---|---|
Parent Directory/ | - | Directory | |
mpegts-segmenter.diff | 2012-Feb-07 10:13:38 | 5.7K | application/octet-stream |
mpegts-segmenter.spec | 2012-Feb-07 10:13:38 | 0.9K | application/octet-stream |
mpegts-segmenter.tar.gz | 2012-Feb-07 10:13:38 | 9.9K | application/octet-stream |
还附带文件切片源码。
下面的地址也可以下载 切片工具的源码,这个工具可能比较完善一点吧。
https://github.com/johnf/m3u8-segmenter 这个是C的切片工具
https://github.com/streamio/streamio-ffmpeg 这个是ruby语言写的转码和切片
五、用FFMPEG实现iPhone的HTTP Stream技术步骤
Step 1: 获取最新版本的 FFMpeg
The FFMpeg download page 从该地址获取最新版本的ffmpeg
使用下面的命令进行配置,生成Makefile文件,然后make吧。
configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264
其中最重要的事情是注意 --enable-libx264 这个编译选项。
Step 2: 转码视频格式,让 iPhone 可以使用
我们必须让ffmpeg创建 X264编码格式的视频流, iPhone才能播放,有几个步骤需要注意:
- 视频文件的码率必须在: 100 Kbps to 1.6 Mbps 这个范围
- 苹果公司建议的视频流为:
- Low – 96 Kbps video, 64 Kbps audio
- Medium – 256 Kbps video, 64 Kbps audio
- High – 800 Kbps video, 64 Kbps audio
- iPhone 的屏幕视频播放尺寸设置为: 480×320
建议使用下面的参数进行视频转码:
假如你想知道这些命令参数的更详细的信息,请参考 X264 encoding guide 和 FFMpeg documentation , 上面例子设置的码率为98k, 你可以修改为你想设置的码率。
要更改的参数为 “ -b, -maxrate, -bufsize values ”
Step 3: 下载并编译 segmenter
现在,你已经完成了视频采集的工作,但是还没有完成整个构建HTTP Streaming 的过程。 你需要一种方法来把视频文件切成小块,你可以下载苹果的 segmenter 。
下载切片源码的SVN地址为 : segmenter source.
下载下来后用下面的命令即可编译 :
gcc -Wall -g segmenter.c -o segmenter -lavformat -lavcodec -lavutil -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad
clean:
rm segmenter
在编译完成了 segmenter 工具之后, 你就可以创建你的 HTTP Streaming 内容了。
命令格式为:
下面是一个使用的例子,从视频文件创建一个流, 每个切片文件10秒:
Step 4: 准备 HTTP server 服务器
进行到这一步的时候, 你应该已经有好多视频流的切片文件了,这些文件可以上传到web服务器, 但是这里有一个比较重要的事情需要注意,那就是mime types的设置。
.ts video/MP2T
假如你使用的是Apache服务器的话,你需要添加如下的代码到 httpd.conf 配置文件里:
AddType video/MP2T .ts
假如你使用的是 lighttpd 服务器的话,你需要添加下面的代码到你的配置文件中:
Step 5: 测试 stream
万事俱备只欠东风了,下来需要使用 HTML5 的 video 标签,例子如下:
上面所有的步骤都正确的话,你现在应该已经看到视频了。
假如你想在应用程序里面测试上面的视频流的话,你需要下载苹果公司的视频播放器,下载地址为: download the MoviePlayer iPhone demo application 。
Step 6: 自动化的 stream 编码和切片 segmentation
这是一个小脚本,可以把输入文件编码转换后再切片为10秒一个的文件小块。
BR=800k
ffmpeg -i $1 -f mpegts -acodec libmp3lame -ar 48000-ab 64k-s 320×240 -vcodec libx264 -b $BR -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8-subq 5-trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71-bt 200k-maxrate $BR -bufsize $BR -rc_eq 'blurCplx^(1-qComp)'-qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4-level 30-aspect 320:240 -g 30 -async 2 sample_$BR_pre.ts
segmenter sample_$BR_pre.ts 10 sample_$BR stream-$BR.m3u8 http://www.ioncannon.net/
rm -f sample_$BR_pre.ts
Step 7: 创建不同码率 rate 的 HTTP stream
之前将的例子都是创建单一码率的HTTP Stream, 我们需要创建不同码率的视频流, 下面是一个简单的小例子。
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=96000
http://192.168.132.15/ipv/stream-96k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000
http://192.168.132.15/ipv/stream-256k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000
http://192.168.132.15/ipv/stream-800k.m3u8
六、让nginx支持MP4文件的直接播放
这是nginx的第三方模块的网址 : http://wiki.nginx.org/3rdPartyModules
http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
编译的时候可能会有点小错误:
解决错误:
因为在新版本的nginx中废弃了 zero_in_uri 这个flag,稍微修改一下 nginx_mod_h264_streaming 的源代码
vim /usr/local/src/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c
把158到161行注释掉
158 //if (r->zero_in_uri)
159 //{
160 // return NGX_DECLINED;
161 //}
然后再make就正常了,make install 完成安装
在nginx配置文件中加入
mp4;
}
FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream流的更多相关文章
- JavaCV FFmpeg采集摄像头YUV数据
前阵子使用利用树莓派搭建了一个视频监控平台(传送门),不过使用的是JavaCV封装好的OpenCVFrameGrabber和FFmpegFrameRecorder. 其实在javacpp项目集中有提供 ...
- 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能
之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度.最近发现很多人问怎么用FFmpeg采集摄像头图像,事实 ...
- FFMPEG(一) 从V4L2捕获摄像头数据
系列相关博文: FFMPEG(一) 从V4L2捕获摄像头数据 FFMPEG(二) v4l2 数据格式装换 FFMPEG(三) v4l2 数据编码H264 最近在学习FFMPEG,发现网上的很多例子都是 ...
- JavaCV FFmpeg采集麦克风PCM音频数据
前阵子用一个JavaCV的FFmpeg库实现了YUV视频数据地采集,同样的采集PCM音频数据也可以采用JavaCV的FFmpeg库. 传送门:JavaCV FFmpeg采集摄像头YUV数据 首先引入 ...
- JavaCV 采集摄像头及桌面视频数据
javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好. 之前使用JavaCV库都是使用ffmpeg native API开发,这种方式 ...
- JavaCV 采集摄像头和麦克风数据推送到流媒体服务器
越来越觉得放弃JavaCV FFmpeg native API,直接使用JavaCV二次封装的API开发是很明智的选择,使用JavaCV二次封装的API开发避免了各种内存操作不当引起的crash. 上 ...
- C#采集摄像头实时画面和抓拍
在.net中,并没有简单直接的操纵摄像头的类.那么如何简单快捷地采集摄像头的画面,进行抓拍等操作呢?答案是调用SharpCapture!专业采集摄像头画面等数据的类库.下面开始演示关键代码,您也可以在 ...
- Linux下用FFMPEG采集usb摄像头到RTMP
Linux下用 FFMPEG 采集 usb摄像头视频 和 摄像头内置麦克风音频 到RTMP服务 ffmpeg -f video4linux2 -qscale 10 -r 12 -s 640x480 ...
- windows ffmpeg 推送摄像头数据到rtmp服务
文本主要讲述windows系统下如何利用ffmpeg获取摄像机流并推送到rtmp服务,命令的用法前文 中有讲到过,这次是通过代码来实现.实现该项功能的基本流程如下: 图1 ffmpeg推流流程图 较前 ...
随机推荐
- 洛谷 P4389: 付公主的背包
题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...
- 搭建RabbitMQ集群(Docker)
前一篇搭建RabbitMQ集群(通用)只是把笔记直接移动过来了,因为我的机器硬盘已经满了,实在是开不了那么虚拟机. 还好,我的Linux中安装了Docker,这篇文章就简单介绍一下Docker中搭建R ...
- rpmbuild 构建rpm包时报错解决 error: Installed (but unpackaged) file(s) found:
解决的办法是找到 /usr/lib/rpm/macros 中%__check_files /usr/lib/rpm/check-files %{buildroot} 注释掉
- python数据库操作 - MySQL入门【转】
python数据库操作 - MySQL入门 python学院 2017-02-05 16:22 PyMySQL是Python中操作MySQL的模块,和之前使用的MySQLdb模块基本功能一致,PyMy ...
- Shell脚本中实现切换用户并执行命令操作【转】
第一种方法 cat test.sh #!/bin/bashsu - test <<EOFpwd;exit;EOF 执行结果图: 第二种方法 当然也可以用下面的命令来执行 复制代码代码如下: ...
- C# 百度搜索结果xpath分析
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- Vue 实现一个中国地图
参考:https://www.cnblogs.com/mazey/p/7965698.html 重点:如何引入中国地图js文件,china.js require('echarts/map/js/chi ...
- 阿里云服务器配置nginx和PHP
1. 安装及启动nginx 输入yum install nginx命令进行nginx的安装,当需要确认时输入”y“确认. yum install nginx 安装完成后,输入service nginx ...
- laravel中短信发送验证码的实现方法
在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Accesskey ,值得说的是,可以通过阿里云提供的子用户进行Accesskey的创建,这样可以更安全 4,充值 larave ...
- Codeforces 1088E Ehab and a component choosing problem
Ehab and a component choosing problem 如果有多个连接件那么这几个连接件一定是一样大的, 所以我们先找到值最大的连通块这个肯定是分数的答案. dp[ i ]表示对于 ...