FFMPEG 摄像头 命令行参数 录像 直播 rtmp

解决FFMPEG采集音视频时不同步的问题:
添加参数  -copyinkf  
例如:
ffmpeg.exe  -copyinkf -f dshow -i video="USB2.0 UVC VGA WebCam":audio="麦克风 (Realtek High Definition Au" -q 4 -s 640*480 -aspect 4:3 -r 10 -vcodec flv   -ar 22050 -ab 64k -ac 1 -acodec libmp3lame -threads 4 -f flv rtmp://127.0.0.1/RTMP/RtmpVideo

其实这个问题,应该看后面的 -re 参数相关,而不是像上面那样解决;


关于Windows上的AAC编码:从官方网站得到的ffmpeg库,用的是VisualOn AAC,所以编码命令是:-acodec libvo_aacenc 


雷霄骅 专栏

FFmpeg获取DirectShow设备数据(摄像头,录屏)

这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘。本文所述的方法主要是对应Windows平台的。

1.       列设备

[plain]  view plain copy
  1. ffmpeg -list_devices true -f dshow -i dummy  

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

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第1张图片

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

[plain]  view plain copy
  1. [dshow @0388f5e0] DirectShow video devices  
  2. [dshow @0388f5e0]  "Integrated Camera"  
  3. [dshow @0388f5e0] "screen-capture-recorder"  
  4. [dshow @0388f5e0] DirectShow audio devices  
  5. [dshow @0388f5e0]  "鍐呰楹﹀厠椋?(Conexant20672 SmartAudi"  
  6. [dshow @0388f5e0]  "virtual-audio-capturer"  

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

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

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

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

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

[plain]  view plain copy
  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv  

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

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

[plain]  view plain copy
  1. ffplay -f dshow -i video="Integrated Camera"  

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

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第2张图片

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

[plain]  view plain copy
  1. ffplay -f vfwcap -i 0  

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

[plain]  view plain copy
  1. ffmpeg -list_options true -f dshow -i video="Integrated Camera"  

输出如下:

[plain]  view plain copy
  1. [dshow @ 03845420] DirectShow video device options  
  2. [dshow @ 03845420]  Pin "鎹曡幏"  
  3. [dshow @ 03845420]   pixel_format=bgr24  min s=640x480 fps=15 max s=640x480 fps=30  
  4. [dshow @ 03845420]   pixel_format=bgr24  min s=640x360 fps=15 max s=640x360 fps=30  
  5. [dshow @ 03845420]   pixel_format=bgr24  min s=352x288 fps=15 max s=352x288 fps=30  
  6. [dshow @ 03845420]   pixel_format=bgr24  min s=320x240 fps=15 max s=320x240 fps=30  
  7. [dshow @ 03845420]   pixel_format=bgr24  min s=800x448 fps=1 max s=800x448 fps=15  
  8. [dshow @ 03845420]   pixel_format=bgr24  min s=960x544 fps=1 max s=960x544 fps=10  
  9. [dshow @ 03845420]   pixel_format=bgr24  min s=1280x720 fps=1 max s=1280x720 fps=10  
  10. [dshow @ 03845420]   pixel_format=bgr24  min s=424x240 fps=15 max s=424x240 fps=30  
  11. [dshow @ 03845420]   pixel_format=yuyv422  min s=640x480 fps=15 max s=640x480 fps=30  
  12. [dshow @ 03845420]   pixel_format=yuyv422  min s=640x360 fps=15 max s=640x360 fps=30  
  13. [dshow @ 03845420]   pixel_format=yuyv422  min s=352x288 fps=15 max s=352x288 fps=30  
  14. [dshow @ 03845420]   pixel_format=yuyv422  min s=320x240 fps=15 max s=320x240 fps=30  
  15. [dshow @ 03845420]   pixel_format=yuyv422  min s=800x448 fps=1 max s=800x448 fps=15  
  16. [dshow @ 03845420]   pixel_format=yuyv422  min s=960x544 fps=1 max s=960x544 fps=10  
  17. [dshow @ 03845420]   pixel_format=yuyv422  min s=1280x720 fps=1 max s=1280x720 fps=10  
  18. [dshow @ 03845420]   pixel_format=yuyv422  min s=424x240 fps=15 max s=424x240 fps=30  
  19. [dshow @ 03845420]   vcodec=mjpeg  min s=640x480 fps=15 max s=640x480 fps=30  
  20. [dshow @ 03845420]   vcodec=mjpeg  min s=640x360 fps=15 max s=640x360 fps=30  
  21. [dshow @ 03845420]   vcodec=mjpeg  min s=352x288 fps=15 max s=352x288 fps=30  
  22. [dshow @ 03845420]   vcodec=mjpeg  min s=320x240 fps=15 max s=320x240 fps=30  
  23. [dshow @ 03845420]   vcodec=mjpeg  min s=800x448 fps=15 max s=800x448 fps=30  
  24. [dshow @ 03845420]   vcodec=mjpeg  min s=960x544 fps=15 max s=960x544 fps=30  
  25. [dshow @ 03845420]   vcodec=mjpeg  min s=1280x720 fps=15 max s=1280x720 fps=30  


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

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

[plain]  view plain copy
  1. ffplay -s 1280x720 -f dshow -i video="Integrated Camera"  
设置分辨率为424x240

[plain]  view plain copy
  1. ffplay -s 424x240 -f dshow -i video="Integrated Camera"  

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

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

[plain]  view plain copy
  1. 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 320x240)调小分辨率。

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

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

[plain]  view plain copy
  1. 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服务器。

[plain]  view plain copy
  1. 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即可。

[plain]  view plain copy
  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666  

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

[plain]  view plain copy
  1. ffplay -vcodec mpeg2video udp://233.233.233.223:6666  

 

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

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

[plain]  view plain copy
  1. 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进行录屏。

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第3张图片

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

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

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

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

最后得到的效果如下图。

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第4张图片

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

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

[plain]  view plain copy
  1. 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之后,开始测试不行,后来发现是自己疏忽大意,乱码部分转码后为“内装麦克风 ”,然后接可以正常使用了。因此,命令应该如下图所示:

[plain]  view plain copy
  1. 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选择“图像->插入滤镜”

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第5张图片

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

FFMPEG 摄像头 命令行参数 录像 直播 rtmp_第6张图片

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

 

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

[plain]  view plain copy
  1. 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发送到组播地址

[plain]  view plain copy
  1. 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 320x240)调小分辨率。

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

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

[plain]  view plain copy
  1. 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文件。该文件可以用于该视频流的播放。如下命令即可播放:

[plain]  view plain copy
  1. ffplay test.sdp  

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

原理同上,不再赘述。

[plain]  view plain copy
  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream  

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

[plain]  view plain copy
  1. 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={窗口名称}”:抓取屏幕中特定的一个窗口。
下面举几个例子。
最简单的抓屏:
[plain]  view plain copy
  1. ffmpeg -f gdigrab -i desktop out.mpg  

从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5
[plain]  view plain copy
  1. ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg 

























《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

执行下面的命令 , 即可显示你的系统支持音频捕获设备,视频捕获设备:

[plain]  view plain copy
  1. c:\> ffmpeg -list_devices true -f dshow -i dummy  
  2. ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect  
  3.   libavutil      51. 74.100 / 51. 74.100  
  4.   libavcodec     54. 65.100 / 54. 65.100  
  5.   libavformat    54. 31.100 / 54. 31.100  
  6.   libavdevice    54.  3.100 / 54.  3.100  
  7.   libavfilter     3. 19.102 /  3. 19.102  
  8.   libswscale      2.  1.101 /  2.  1.101  
  9.   libswresample   0. 16.100 /  0. 16.100  
  10. [dshow @ 03ACF580] DirectShow video devices  
  11. [dshow @ 03ACF580]  "Integrated Camera"  
  12. [dshow @ 03ACF580]  "screen-capture-recorder"  
  13. [dshow @ 03ACF580] DirectShow audio devices  
  14. [dshow @ 03ACF580]  "Internal Microphone (Conexant 2"  
  15. [dshow @ 03ACF580]  "virtual-audio-capturer"  
  16. dummy: Immediate exit requested  

我们下来使用 视频捕获设备 "Integraged Camera" 保存为MP4文件:

[plain]  view plain copy
  1. c:\> ffmpeg -f dshow -i video="Integrated Camera" out.mp4  

嘿嘿,摄像头灯亮了,文件已经输出到了和 ffmpeg.exe 相同的路径下面。 用VLC播放 out.mp4文件,正常。

用下面的命令可以查看视频捕获设备支持的图片大小等详细信息。

[plain]  view plain copy
  1. C:\ffmpeg\bin>ffmpeg -f dshow -list_options true -i video="Integrated Camera"  

用下面的命令我们可以把视频分辨率存储为1280x720,  FPS为15帧/秒, 输出为 out.avi 文件。是不是很方便啊 ?

[plain]  view plain copy
  1. 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的形式。

[plain]  view plain copy
  1. ffmpeg -y -f vfwcap -i list  
输出如下 :

[plain]  view plain copy
  1.   libavutil      52. 41.100 / 52. 41.100  
  2.   libavcodec     55. 24.100 / 55. 24.100  
  3.   libavformat    55. 13.102 / 55. 13.102  
  4.   libavdevice    55.  3.100 / 55.  3.100  
  5.   libavfilter     3. 82.100 /  3. 82.100  
  6.   libswscale      2.  4.100 /  2.  4.100  
  7.   libswresample   0. 17.103 /  0. 17.103  
  8.   libpostproc    52.  3.100 / 52.  3.100  
  9. [vfwcap @ 000000000034d940] Driver 0  
  10. [vfwcap @ 000000000034d940]  Microsoft WDM Image Capture (Win32)  
  11. [vfwcap @ 000000000034d940]  Version:  6.1.7600.16385  
  12. list: Input/output error  

从上面看出 vfwcap的索引号为0, 用下面的命令即可捕获视频数据。其中 -i 0 就代表使用ID为0的视频采集设备, -r 25代表帧率为25帧/秒

[plain]  view plain copy
  1. 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技术步骤

原文出处 :http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/


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才能播放,有几个步骤需要注意:

  1. 视频文件的码率必须在: 100 Kbps to 1.6 Mbps    这个范围
  2. 苹果公司建议的视频流为:
    • Low – 96 Kbps video, 64 Kbps audio
    • Medium – 256 Kbps video, 64 Kbps audio
    • High – 800 Kbps video, 64 Kbps audio
  3. iPhone 的屏幕视频播放尺寸设置为: 480×320

建议使用下面的参数进行视频转码:


ffmpeg -i -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -s 320×240 -vcodec libx264 -b 96k -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 96k -bufsize 96k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2

假如你想知道这些命令参数的更详细的信息,请参考 X264 encoding guide  和 FFMpeg documentation , 上面例子设置的码率为98k, 你可以修改为你想设置的码率。

要更改的参数为   “   -b, -maxrate,  -bufsize values   ”


Step 3: 下载并编译 segmenter 

现在,你已经完成了视频采集的工作,但是还没有完成整个构建HTTP  Streaming 的过程。 你需要一种方法来把视频文件切成小块,你可以下载苹果的 segmenter 。

下载切片源码的SVN地址为 :  segmenter source.  

下载下来后用下面的命令即可编译 :

all:
        gcc -Wall -g segmenter.c -o segmenter -lavformat -lavcodec -lavutil -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad

clean:
        rm segmenter

在编译完成了 segmenter 工具之后, 你就可以创建你的 HTTP  Streaming 内容了。

命令格式为:

segmenter

下面是一个使用的例子,从视频文件创建一个流, 每个切片文件10秒:

segmenter sample_low.ts 10 sample_low stream_low.m3u8 http://www.ioncannon.net/

Step 4: 准备 HTTP server 服务器

进行到这一步的时候, 你应该已经有好多视频流的切片文件了,这些文件可以上传到web服务器, 但是这里有一个比较重要的事情需要注意,那就是mime types的设置。

.m3u8    application/x-mpegURL
.ts      video/MP2T

假如你使用的是Apache服务器的话,你需要添加如下的代码到 httpd.conf 配置文件里:

AddType application/x-mpegURL .m3u8
AddType video/MP2T .ts

假如你使用的是 lighttpd  服务器的话,你需要添加下面的代码到你的配置文件中:

mimetype.assign = ( ".m3u8" => "application/x-mpegURL", ".ts" => "video/MP2T" )

Step 5: 测试 stream

万事俱备只欠东风了,下来需要使用 HTML5 的 video 标签,例子如下:

<html>
   <head>
     <title>Video Test </title>
     <metaname="viewport"content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
   </head>
   <bodystyle="background-color:#FFFFFF; ">
     <center>
       width='150'height='150'src="stream-128k.m3u8"/>
     </center>
   </body>
</html>

上面所有的步骤都正确的话,你现在应该已经看到视频了。

假如你想在应用程序里面测试上面的视频流的话,你需要下载苹果公司的视频播放器,下载地址为: download the MoviePlayer iPhone demo application 。 


Step 6: 自动化的 stream 编码和切片 segmentation

这是一个小脚本,可以把输入文件编码转换后再切片为10秒一个的文件小块。


#!/bin/sh

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, 我们需要创建不同码率的视频流, 下面是一个简单的小例子。

[plain]  view plain copy
  1. #EXTM3U  
  2. #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=96000  
  3. http://192.168.132.15/ipv/stream-96k.m3u8  
  4. #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000  
  5. http://192.168.132.15/ipv/stream-256k.m3u8  
  6. #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000  
  7. http://192.168.132.15/ipv/stream-800k.m3u8  

六、让nginx支持MP4文件的直接播放

这是nginx的第三方模块的网址 : http://wiki.nginx.org/3rdPartyModules

在上面可以找到支持MP4的模块,我们也可以直接从下面的网址下载 :
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行注释掉

157   /* TODO: Win32 */
158   //if (r->zero_in_uri)
159   //{
160   //  return NGX_DECLINED;
161   //}

然后再make就正常了,make install 完成安装

在nginx配置文件中加入

location ~ .mp4$ {
                mp4;
        }



下面的命令从摄像头采集数据后发送到服务器进行切片

[plain]  view plain copy
  1. C:\ffmpeg-win64-static\bin>ffmpeg.exe  -f  dshow  -i  video="Integrated Camera"  -vcodec  libx264  -pix_fmt  yuv420p  -f  flv  rtmp://192.168.59.129/hls/mystream  


下面的命令时以文件gd.flv为输入数据流, 转码后发送到服务器进行切片

[plain]  view plain copy
  1. C:\ffmpeg-win64-static\bin>ffmpeg.exe -re  -i  "E:\Movie\gd.flv"  -vcodec   copy  -acodec   copy   -f   flv   rtmp://192.168.59.129/hls/mystream  

[plain]  view plain copy
  1. ffmpeg.exe -f dshow -i video="Integrated Camera":audio="麦克风 (Realtek High Definition Au" -q 4 -s 640*480 -aspect 4:3 -r 10 -vcodec flv  -ar 22050 -ab 64k -ac 1 -acodec libmp3lame -threads 4 -f flv rtmp://192.168.59.129/hls/mystream  
  2. ffmpeg.exe -f dshow -i video="Integrated Camera":audio="麦克风 (Realtek High Definition Au" -s 640*480 -vcodec  libx264 -acodec libmp3lame -pix_fmt  yuv420p -threads 4 -f  flv  rtmp://192.168.59.129/hls/mystream  

虚拟切片:

https://github.com/AndyA/ts-split


摄像头采集后的数据直接切片 :

ffmpeg.exe -f dshow -i video="Integrated Camera":audio="麦克风 (Realtek High Definition Au" -s 640*480 -vcodec  libx264 -acodec libmp3lame -flags -global_header -map 0 -f segment -segment_time 10 -segment_list live.m3u8 -segment_format mpegts live%05d.ts


FMPEG 把文件传送到rtmp的速度不正常的问题:

ffmpeg  -re -i "输入文件"-qscale 3 -s 720*360 -aspect 16:9 -r 25 -threads 4 -vcodec flv-acodec libmp3lame -ar 44100 -ab 128k -ac 2 -f flvrtmp://127.0.0.1/rtmpsvr/RtmpVideo

关键是  -re解决同步压缩和办法的速度同步问题, 而且要放在前面,不然不一定起作用












ffmpeg处理rtmp直播流(截图、收录)

首先应该感谢http://hi.baidu.com/newdreamllc/item/ee6beb0e2bbbcc8f02ce1ba6(天下文章一大抄),也不知道他是抄过来的还是自己写的,他给了我启发,当然不是抄的启发,而是里面内容确实让我完成了ffmpeg对rtmp直播流截图的处理,之前都有试过用opencv写个程序截图,但是写完发现,在使用载入视频流函数的时间比较长,这个也就容忍了,竟然在输入错误的流地址的时候,程序竟然死了,对,就是死掉了!!!我这样对程序严谨的人,怎么能允许这个错误呢,果断抛弃。废话不多说,先看我的一系列参数:

 

[plain]  view plain copy print ?
  1. ffmpeg.exe -probesize 32768 -i "rtmp://{ip}/live/1 live=1" -y -t 0.001 -ss 1 -f image2 -r 1 c:/rtm.jpeg  


可能,也许,差不多后面的参数少的话就出现什么流找不到啊,什么的,下面来分析一下参数

-probesize 32768 :没有查到这个参数什么意思,不过字面意思是探针的大小,可能是内存申请32768大小的内存把

-i “rtmp。。。”    :后接地址

-y                              :覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了

-t 0.001                   :设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss 1                       :延迟1秒后开始

-f image2               :以图片格式保存

-r 1                          :帧数,此处为截取一帧

最重要的要说一下: 在-i 后的地址,要用双引号括起来,如果是rtmp直播流,双引号里面要加上live=1

如果还不行的话,估计就是ffmpeg这个sdk有问题了,可能是里面没有兼容rtmp的东西,看看第一行链接里面的东西把,希望对你们有帮助。



重要:

当上述命令可以执行以后,会发现,录制的视频或者直播的视频图像质量非常不好,这是因为没有设置视频码率;

设置视频码率命令为: -s 640x360 -b:v 580k ;

可以根据具体的分辨率设置具体的码率;


也可以通过 -qscale,设置图像质量;

你可能感兴趣的:(RTMP,编解码)