FFmpeg 是一个基于命令行的工具,可以利用它进行转码和推流。这篇文章介绍了如何将FFmpeg当作一个实时编码器,推流到Wowza Streaming Engine™软件。
注意: 需要FFmpeg N-52458-gaa96439 及以上版本的支持。随着新版本的发布,FFmpeg 的命令可能会变化很快,所以你最好是从它的官方文档FFmpeg documentation 了解更多的编码细节。
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转发流下面的这个例子是将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 -vbsfh264_mp4toannexb -strict experimental -f mpegtsudp://127.0.0.1:10000?pkt_size=1316
5.根据How to publish and play a livestream (MPEG-TS based encoder) 的介绍配置一个直播应用来发布FFmpeg推送过来的流。当你配置stream file的时候,请使用udp://127.0.0.1:10000?pkt_size=1316作为源流的Stream URI.
在上面的例子中,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-frameinterval)的一半。
用FFmpeg进行转码
FFmpeg可以用来对RTSP流、native RTP流或MPEG-TS流进行转码。要对一个视频源做转码,请在命令行将输入源(也就上面例子中的sample.mp4文件)改为对应的输入源,去掉-re参数。下面是几个例子:
RTSP/RTP camera
ffmpeg -i"rtsp://[camera-ip-address]/[camera-URI-syntax]" -vcodec libx264 -vb150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac2 -vbsf h264_mp4toannexb -strict experimental -f mpegtsudp://127.0.0.1:10000?pkt_size=1316
MPEG-TS stream
ffmpeg -i"udp://localhost:[port]" -vcodec libx264 -vb 150000 -g 60 -vprofilebaseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsfh264_mp4toannexb -strict experimental -f mpegtsudp://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 -strictexperimental -f mpegts udp://127.0.0.1:10000?pkt_size=1316
其它推流协议
FFmpeg 也可以用其它协议推流,例如RTMP、RTSP/RTP (QuickTime ANNOUNCE).
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服务器中应用名(例如live 或 vod)。
· The [stream-name] 流的名字。
其它一些FFmpeg命令的例子
需要进行用户名和密码验证的RTSP推流
下面的例子使用了推流认证、H.264/AAC、baselineprofile、level 3.0、24 fps (帧率)、2秒的关键帧间隔、350kbps 码率, 44.1khz采样率、立体声。
ffmpeg -re -isample.mp4 -c:v libx264 -profile:v baseline -level 3.0 -r 24 -g 48 -keyint_min48 -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位色彩:
ffmpeg -y -fdshow -s 640x480 -r:v 15 -i video="IntegratedWebcam":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=ConstrainedBaseline
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 -ibigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:vveryfast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264optsno-mbtree:bframes=1 -pass 1 -b:v 286k -s 384x216 bigbuck-350k.mp4
ffmpeg -y -ibigbuckbunny_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 -ibigbuckbunny_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 -x264optsno-mbtree:bframes=1 -pass 2 -b:v 836k -s 640x360 bigbuck-900k.mp4
Wowza Streaming Engine 4是业界功能强大、API接口丰富的流媒体Server产品,采用它作为流媒体服务器产品的案例很多,直播、在线教育、IPTV都有它的用武之地。