Bernie Yu » 录制 http://bernieyu.com 复刻生活 Tue, 17 May 2016 09:03:15 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.2.38 在Windows下搭建基于nginx的视频直播和点播系统 http://bernieyu.com/2015/06/build-video-live-and-vod-with-nginx-rtmp-on-windows/ http://bernieyu.com/2015/06/build-video-live-and-vod-with-nginx-rtmp-on-windows/#comments Fri, 19 Jun 2015 09:00:27 +0000 http://bernieyu.com/?p=234   >>阅读全文<<]]> 一、软件准备

由于nginx原生是为linux服务的,因此官方并没有编译好的windows版本可以下载,要在windows上使用nginx,要么下载源码进行编译,要么使用其他人已经编译好的文件。

而要让nginx支持视频直播和点播,还需要第三方的nginx模块:nginx-rtmp-module

所幸,已经有大神做好了nginx的编译,而且集成了很多nginx模块,其中就已经包括了nginx-rtmp-module

下载地址:http://nginx-win.ecsds.eu/,详细说明可参见:Readme nginx-win version.txt

我下载的是nginx 1.7.11.3 Gryphon这个版本。

这个网站同时也提供了vcredist的下载(x86x64),以避免运行nginx时出现缺少库的错误。

另外还要下载 stat.xsl 用于显示当前ngix-rtmp服务状态

另外还需要下载ffmpeg、ffplay、yamdi:

总结如下:

1. nginx 1.7.11.3 Gryphon

2. stat.xsl

3. ffmpeg、ffplay

4. yamdi

二、Nginx 配置

 1. nginx配置

worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application hls {
             live on;  #启用rtmp直播
                       #地址为rtmp://[server]:[rtmp_port]/[app]/[stream]
             hls on;   #启用hls直播
                       #地址为http://[server]:[http_port]/[app]/[stream].m3u8
                       #需要配合下面http段设置使用
             hls_path nginx-rtmp-module/tmp/app/;
             hls_fragment 5s;
             recorder rec {  #启用录制
               record all manual;  #手动控制录制启停
               record_suffix _rec.flv;
               record_path nginx-rtmp-module/tmp/rec/;  #录制保存地址
               record_unique on;
           }
       }
       application vod2{  #rtmp点播
       		play nginx-rtmp-module/tmp/rec/;    
       }
    }
}

http {
    server {
        listen      18080;

        location /stat {  #服务器状态
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root nginx-rtmp-module/;
        }

        location /control { #控制器
            rtmp_control all;
        }
        
	location /hls/ {  #hls直播地址
           #server hls fragments
           types{
             application/vnd.apple.mpegurl m3u8;
             video/mp2t ts;
           }
           alias nginx-rtmp-module/tmp/app/;
           expires -1;
        }

        location /vod/{  #hls点播地址
            alias nginx-rtmp-module/tmp/rec/;
        }

        location / {
            root nginx-rtmp-module/test/www/;
        }
    }
}

三、测试

1. 启动nginx

start nginx_1.7.11.3_Gryphon\nginx

2. 推送rtmp流到nginx-rtmp

start ffmpeg\ffmpeg -re -i rtmp://live.hkstv.hk.lxdns.com/live/hks -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec copy -f flv rtmp://localhost:1935/hls/mystream -loglevel quiet

3. rtmp直播

ffmpeg\ffplay "rtmp://127.0.0.1:1935/hls/mystream"

4. hls 直播

ffmpeg\ffplay "http://127.0.0.1:18080/hls/mystream.m3u8"

5. 开始录制

http://127.0.0.1:18080/control/record/start?app=hls&name=mystream&rec=rec

6. 停止录制

http://127.0.0.1:18080/control/record/stop?app=hls&name=mystream&rec=rec

7. 为rtmp点播文件添加索引,否则文件在播放时进度条不能拖动,假定刚才录制的文件名为mystream-1428384476_rec.flv

yamdi\yamdi -i nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec.flv -o nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec_idx.flv

8. rtmp点播

ffmpeg\ffplay "rtmp://127.0.0.1:1935/vod2/mystream-1428384476_rec_idx.flv"

9. 制作hls点播分片文件

ffmpeg\ffmpeg -i E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec.flv -acodec copy -bsf:a h264_mp4toannexb -g 105 -vcodec libx264 -vprofile baseline -bf 0 -bufsize 850k -bsf:v dump_extra -map 0 -f segment -segment_format mpegts -segment_list "E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec\mystream-1428384476_rec.m3u8" -segment_time 10 E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec\mystream-1428384476_rec-%d.ts

10. hls 点播

ffplay "http://127.0.0.1:8080/vod/mystream-1428384476_rec/mystream-1428384476_rec.m3u8"
]]>
http://bernieyu.com/2015/06/build-video-live-and-vod-with-nginx-rtmp-on-windows/feed/ 0
[转] FFmpeg获取DirectShow设备数据(摄像头,录屏) http://bernieyu.com/2015/04/ffmpeg-get-directshow-device-cam-screen-record/ http://bernieyu.com/2015/04/ffmpeg-get-directshow-device-cam-screen-record/#comments Tue, 07 Apr 2015 02:55:30 +0000 http://bernieyu.com/?p=39   >>阅读全文<<]]> 1. 列设备

ffmpeg -list_devices true -f dshow -i dummy

命令执行后输出的结果如下(注:中文的设备会出现乱码的情况)。列表显示设备的名称很重要,输入的时候都是使用“-f dshow -i video=”{设备名}””的方式。

1

我自己的机器上列出了以下设备:

[dshow @0388f5e0] DirectShow video devices  
[dshow @0388f5e0]  "Integrated Camera"  
[dshow @0388f5e0] "screen-capture-recorder"  
[dshow @0388f5e0] DirectShow audio devices  
[dshow @0388f5e0]  "鍐呰楹﹀厠椋?(Conexant20672 SmartAudi"  
[dshow @0388f5e0]  "virtual-audio-capturer"

下文的测试中,使用其中的两个视频输入:”Integrated Camera”和”screen-capture-recorder”。

注:音频设备出现乱码,这个问题的解决方法会随后提到。

 

2. 获取摄像头数据(保存为本地文件或者发送实时流)

2.1. 编码为H.264,保存为本地文件

下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv

 2.2. 直接播放摄像头的数据

使用ffplay可以直接播放摄像头的数据,命令如下:

ffplay -f dshow -i video="Integrated Camera"

如果设备名称正确的话,会直接打开本机的摄像头,如图所示。

2

注:除了使用DirectShow作为输入外,使用VFW也可以读取到摄像头的数据,例如下述命令可以播放摄像头数据:

ffplay -f vfwcap -i 0

此外,可以使用FFmpeg的list_options查看设备的选项:

ffmpeg -list_options true -f dshow -i video="Integrated Camera"

输出如下:

[dshow @ 03845420] DirectShow video device options  
[dshow @ 03845420]  Pin "鎹曡幏"  
[dshow @ 03845420]   pixel_format=bgr24  min s=640x480 fps=15 max s=640x480 fps=30  
[dshow @ 03845420]   pixel_format=bgr24  min s=640x360 fps=15 max s=640x360 fps=30  
[dshow @ 03845420]   pixel_format=bgr24  min s=352x288 fps=15 max s=352x288 fps=30  
[dshow @ 03845420]   pixel_format=bgr24  min s=320x240 fps=15 max s=320x240 fps=30  
[dshow @ 03845420]   pixel_format=bgr24  min s=800x448 fps=1 max s=800x448 fps=15  
[dshow @ 03845420]   pixel_format=bgr24  min s=960x544 fps=1 max s=960x544 fps=10  
[dshow @ 03845420]   pixel_format=bgr24  min s=1280x720 fps=1 max s=1280x720 fps=10  
[dshow @ 03845420]   pixel_format=bgr24  min s=424x240 fps=15 max s=424x240 fps=30  
[dshow @ 03845420]   pixel_format=yuyv422  min s=640x480 fps=15 max s=640x480 fps=30  
[dshow @ 03845420]   pixel_format=yuyv422  min s=640x360 fps=15 max s=640x360 fps=30  
[dshow @ 03845420]   pixel_format=yuyv422  min s=352x288 fps=15 max s=352x288 fps=30  
[dshow @ 03845420]   pixel_format=yuyv422  min s=320x240 fps=15 max s=320x240 fps=30  
[dshow @ 03845420]   pixel_format=yuyv422  min s=800x448 fps=1 max s=800x448 fps=15  
[dshow @ 03845420]   pixel_format=yuyv422  min s=960x544 fps=1 max s=960x544 fps=10  
[dshow @ 03845420]   pixel_format=yuyv422  min s=1280x720 fps=1 max s=1280x720 fps=10  
[dshow @ 03845420]   pixel_format=yuyv422  min s=424x240 fps=15 max s=424x240 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=640x480 fps=15 max s=640x480 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=640x360 fps=15 max s=640x360 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=352x288 fps=15 max s=352x288 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=320x240 fps=15 max s=320x240 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=800x448 fps=15 max s=800x448 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=960x544 fps=15 max s=960x544 fps=30  
[dshow @ 03845420]   vcodec=mjpeg  min s=1280x720 fps=15 max s=1280x720 fps=30

可以通过输出信息设置摄像头的参数。

例如,设置摄像头分辨率为1280×720

ffplay -s 1280x720 -f dshow -i video="Integrated Camera"

设置分辨率为424×240

ffplay -s 424x240 -f dshow -i video="Integrated Camera"

2.3. 编码为H.264,发布UDP

下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为UDP并发送至组播地址。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:高分辨率的情况下,使用UDP可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如-s 320×240)调小分辨率。

 

 2.4. 编码为H.264,发布RTP

下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为RTP并发送至组播地址。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放。

 

2.5. 编码为H.264,发布RTMP

下面这条命令,实现了:获取摄像头数据->编码为H.264->并发送至RTMP服务器。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream

 

2.6. 编码为MPEG2,发布UDP

与编码为H.264类似,指明-vcodec即可。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666

播放MPEG2的UDP流如下。指明-vcodec为mpeg2video即可

ffplay -vcodec mpeg2video udp://233.233.233.223:6666

 

3. 屏幕录制(Windows平台下保存为本地文件或者发送实时流)

Linux下使用FFmpeg进行屏幕录制相对比较方便,可以使用x11grab,使用如下的命令:

ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec libx264 –preset:v ultrafast –tune:v zerolatency -crf 18 -f mpegts udp://localhost:1234

详细时使用方式可以参考这篇文章:DesktopStreaming With FFmpeg for Lower Latency

Linux录屏在这里不再赘述。在Windows平台下屏幕录像则要稍微复杂一些。在Windows平台下,使用-dshow取代x11grab。一句话介绍:注册录屏dshow滤镜(例如screen-capture-recorder),然后通过dshow获取录屏图像然后编码处理。

因此,在使用FFmpeg屏幕录像之前,需要先安装dshow滤镜。在这里推荐一个软件:screen capture recorder。安装这个软件之后,就可以通过FFmpeg屏幕录像了。

 

screen capture recorder项目主页:

http://sourceforge.net/projects/screencapturer/

下载地址:

http://sourceforge.net/projects/screencapturer/files

下载完后,一路“Next”即可安装完毕。注意,需要Java运行环境(Java Runtime Environment),如果没有的话下载一个就行。

screen capture recorder本身就可以录屏,不过这里我们使用FFmpeg进行录屏。

3

 

3.1. 编码为H.264,保存为本地文件

下面的命令可以将屏幕录制后编码为H.264并保存为本地文件。

ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv

注:“-r 5”的意思是把帧率设置成5。

最后得到的效果如下图。

4

此外,也可以录声音,声音输入可以分成两种:一种是真人说话的声音,通过话筒输入;一种是虚拟的声音,即录屏的时候电脑耳机里的声音。下面两条命令可以分别录制话筒的声音和电脑耳机里的声音。

录屏,伴随话筒输入的声音

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="鍐呰楹﹀厠椋?(Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

上述命令有问题:audio那里有乱码,把乱码ANSI转UTF-8之后,开始测试不行,后来发现是自己疏忽大意,乱码部分转码后为“内装麦克风 ”,然后接可以正常使用了。因此,命令应该如下图所示:

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="内装麦克风 (Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

注:

如果不熟悉ANSI转码UTF-8的话,还有一种更简单的方式查看设备的名称。即不使用FFmpeg查看系统DirectShow输入设备的名称,而使用DirectShow SDK自带的工具GraphEdit(或者网上下一个GraphStudioNext)查看输入名称。

打开GraphEdit选择“图像->插入滤镜”

5

然后就可以通过查看Audio Capture Sources来查看音频输入设备的简体中文名称了。从图中可以看出是“内装麦克风 (Conexant 20672 SmartAudi”。

6

PS:感觉这条命令适合做讲座之类的时候使用

 

录屏,伴随耳机输入的声音

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv

PS:测这条命令的时候,这在听歌,因此录制的视频中的音频就是那首歌曲。

 

3.2. 编码为H.264,发布UDP

下面的命令可以将屏幕录制后编码为H.264并封装成UDP发送到组播地址

ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:高分辨率的情况下,使用UDP可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如-s 320×240)调小分辨率。

 

3.3. 编码为H.264,发布RTP

下面的命令可以将屏幕录制后编码为H.264并封装成RTP并发送到组播地址

ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp

注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

注2:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放。如下命令即可播放:

ffplay test.sdp

 

3.4. 编码为H.264,发布RTMP

原理同上,不再赘述。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream

注意:播放RTMP的时候,-max_delay参数会比较明显的影响延迟,将此参数值设定小一些,有利于降低延时。

ffplay -max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"

 

4. 另一种屏幕录制的方式(2014.10.1更新)

最近发现FFmpeg还有一个专门用于Windows下屏幕录制的设备:gdigrab。

gdigrab是基于GDI的抓屏设备,可以用于抓取屏幕的特定区域。在这里记录一下gdigrab的用法。

gdigrab通过设定不同的输入URL,支持两种方式的屏幕抓取:
(1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。
(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。

下面举几个例子。

最简单的抓屏:

ffmpeg -f gdigrab -i desktop out.mpg

从屏幕的(10,20)点处开始,抓取640×480的屏幕,设定帧率为5

ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

 

转自:http://blog.csdn.net/leixiaohua1020/article/details/38284961

感谢原作者 雷霄骅

 

]]>
http://bernieyu.com/2015/04/ffmpeg-get-directshow-device-cam-screen-record/feed/ 0