多协议、性能稳定、丰富API的流媒体服务器软件
如何使用FFMpeg向Wowza推流?
FFmpeg 是一个基于命令行的工具,可以利用它进行转码和推流。这篇文章介绍了如何将FFmpeg当作一个实时编码器,推流到Wowza Streaming Engine™软件。

注意: 需要FFmpeg N-52458-gaa96439 及以上版本的支持。随着新版本的发布,FFmpeg 的命令可能会变化很快,所以你最好是从它的官方文档FFmpeg documentation 了解更多的编码细节。

内容提要


FFmpeg的基本命令说明
利用FFmpeg来转发流
利用FFmpeg来转码
各类不同协议的推流
其它一些FFmpeg命令的例子
其它技术资料

FFmpeg的基本命令说明


FFmpeg的基本命令格式,如下所示:
ffmpeg [input-options] -i [input-file] [output-options] [output-stream-URI]
		
其中:

  • [input-options]是一些针对输入源的可选参数。例如,如果输入源是视频文件,那么-re参数会根据输入文件的帧率对外推送流。

  • [input-file]是作为输入源的视频文件或要转发的直播流

  • [output-options] 是一些针对输出流的可选参数。例如-f参数设置了输入流的格式。

  • [output-stream-URI]是输出流的URL,URL的具体格式依赖输出流的格式。

要了解更多关于使用FFmpeg的细节,请参考它的官方文档FFmpeg documentation

使用FFmpeg转发流



下面的这个例子是将Wowza安装目录[install-dir]/content/sample.mp4文件作为视频源对外推送视频流。

安装FFmpeg (Windows):

  1. 下载FFmpeg的最新版本,下载地址:http://ffmpeg.zeranoe.com/builds//。将其解压缩到Wowza所在的服务器上。

  2. 创建一个新的目录C:/usr/local/share/ffmpeg。将FFmpeg的presets目录拷贝到这个新的目录下。

  3. 打开命令行提示窗口,输入以下命令,进入FFmpeg的安装目录下的bin目录:

    cd [ffmpeg-install-dir]\bin
    				

  4. 输入下面的FFmpeg命令将Wowza安装目录/content/下的sample.mp4文件做为视频源通过UDP推送到本机端口:
    ffmpeg -re -i "%WMSAPP_HOME%/content/sample.mp4"  -vcodec libx264  -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
    				
  5. 根据How to publish and play a live stream (MPEG-TS based encoder) 的介绍配置一个直播应用来发布FFmpeg推送过来的流。 当你配置stream file的时候,请使用udp://127.0.0.1:10000?pkt_size=1316作为源流的Stream URI.了解更多Wowza产品细节

在上面的例子中,FFmpeg推送了一个低码率、低编码复杂度、低质量的流,以保障它在大多数设备上都可以正常播放。 要推送出去一个高质量的流,请使用下面的例子:
ffmpeg -re -i "%WMSAPP_HOME%/content/sample.mp4"  -vcodec libx264  -vb 500000 -g 60 -vprofile main -acodec aac -ab 128000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
		
注意:
  • sample.mp4文件的时长大约是6分钟。在流传输结束后,FFmpeg将停止推流。因此如果测试期间你要继续推流,你就得反复启动FFmpeg推流命令。 用下面的prefix 参数可以让FFmpeg持续不间断地循环推送流:

    FOR /L %% IN (0) DO

  • 如果Wowza server安装在另外一台服务器上,你需要将udp://127.0.0.1:10000中的IP地址改为Wowza server所在服务器的IP地址,端口可以改为任意UDP端口。 另外要确认这个端口没被路由器、防火墙屏蔽。

  • Microsoft Silverlight 播放器需要关键帧间隔为2秒,因此需要将-r参数 (帧率) 设置为-g 值(GOP or i-frame interval)的一半。

用FFmpeg进行转码


FFmpeg可以用来对RTSP流、native RTP流或MPEG-TS流进行转码。 要对一个视频源做转码,请在命令行将输入源(也就上面例子中的sample.mp4文件)改为对应的输入源,去掉-re参数。下面是几个例子:

RTSP/RTP camera
ffmpeg -i "rtsp://[camera-ip-address]/[camera-URI-syntax]" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
		
MPEG-TS stream
ffmpeg -i "udp://localhost:[port]" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
		
Native RTP stream
ffmpeg -i "unicast.sdp" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
		

其它推流协议

FFmpeg 也可以用其它协议推流,例如RTMP、RTSP/RTP (QuickTime ANNOUNCE). 了解更多Wowza产品细节

RTMP

要推送RTMP流,将FFmpeg命令行中输出流的url做如下修改:

-f mpegts udp://127.0.0.1:10000?pkt_size=1316

改为:

-f flv rtmp://127.0.0.1/live/myStream

rtmp流的url格式:rtmp://[wowza-ip-address]:1935/[application]/[streamName].

RTSP/RTP

要推送RTSP/RTP流, 将FFmpeg命令行中输出流的url做如下修改:

-f mpegts udp://127.0.0.1:10000?pkt_size=1316

改为:

-f rtsp rtsp://127.0.0.1:1935/live/myStream.sdp

RTSP流的url格式: rtsp://[wowza-ip-address]:1935/[application]/[streamName].

其中:

  • [wowza-ip-address] 是Wowza服务器的IP地址

  • The [application] Wowza服务器中应用名(例如livevod)。

  • The [stream-name] 流的名字。

其它一些FFmpeg命令的例子



需要进行用户名和密码验证的RTSP推流

下面的例子使用了推流认证、H.264/AAC、baseline profile、level 3.0、24 fps (帧率)、2秒的关键帧间隔、350kbps 码率, 44.1khz采样率、立体声。

ffmpeg -re -i sample.mp4 -c:v libx264 -profile:v baseline -level 3.0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -vb 310k -c:a libvo_aacenc -ab 40k -ar 44100 -ac 2 -f rtsp -muxdelay 0.1 rtsp://username:password@[wowza-ip-address]:1935/live/myStream
		
RTP推流并生成SDP文件

下面的例子采集当前设备的摄像头视频和麦克风音频,编码后推送RTP流,并生成SDP文件,编码时使用15帧率和12位色彩:了解更多Wowza产品细节

ffmpeg -y -f dshow -s 640x480 -r:v 15 -i video="Integrated Webcam":audio="Microphone (Realtek High Defini" -c:v libx264 -pix_fmt yuv420p -vb 450 -an -map 0:0 -f rtp rtp://127.0.0.1:10000 -flags +global_header -c:a libvo_aacenc -vn -map 0:1 -f rtp rtp://127.0.0.1:10002 > 10000.sdp
		
显示编码参数信息

下面的命令显示一个VOD文件或直播流的编码参数信息,可以用来做故障排查:

ffprobe -show_streams [stream-name]

下面是用这个命令查看sample.mp4的编码参数信息:

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Constrained Baseline
codec_type=video
codec_time_base=1/60
codec_tag_string=avc1
codec_tag=0x31637661
width=512
height=288
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=21
timecode=N/A
id=N/A
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/15360
start_pts=0
start_time=0.000000
duration_ts=9747968
duration=634.633333
bit_rate=640158
nb_frames=19039
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:language=und
TAG:handler_name=VideoHandler
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=-1024
start_time=-0.021333
duration_ts=30439936
duration=634.165333
bit_rate=96193
nb_frames=29727
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:language=und
TAG:handler_name=SoundHandler
[/STREAM]
		
列出可用的视频和音频采集设备名称

下面的例子列出了当前可用的摄像头和麦克风设备名称:

ffmpeg -list_devices true -f dshow -i dummy

将ts文件转码为mp4文件

下面的这个例子将ts文件转码为mp4文件:

ffmpeg -i input.ts -c:v copy -c:a copy output.mp4

检查关键帧对齐(仅限Linux系统)

下面的这个例子检查了一个视频内容的多个多码率文件之间关键帧是否对齐。这个例子确认这几个多码率文件中每一个关键帧中的PTS 和 DTS 时间戳都保持一致。 要了解更多关于码率自适应中的关键帧对齐问题,请阅读如何实现码率自适应流传输.

ffprobe -output_format csv -show_frames [stream-name] |grep I
	    

生成关键帧对齐的视频文件(仅限Linux系统)

这个例子生成了关键针对齐的多码率文件,它使用了bigbuckbunny_1500.mp4作为源文件,你可以下载下来做个测试。
ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v veryfast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 1 -b:v 286k -s 384x216 bigbuck-350k.mp4
ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v fast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 2 -b:v 286k -s 384x216 bigbuck-350k.mp4
ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v fast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 2 -b:v 836k -s 640x360 bigbuck-900k.mp4

其它技术资料