注意: 需要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):
- 下载FFmpeg的最新版本,下载地址:http://ffmpeg.zeranoe.com/builds//。将其解压缩到Wowza所在的服务器上。
- 创建一个新的目录C:/usr/local/share/ffmpeg。将FFmpeg的presets目录拷贝到这个新的目录下。
-
打开命令行提示窗口,输入以下命令,进入FFmpeg的安装目录下的bin目录:
cd [ffmpeg-install-dir]\bin
-
输入下面的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
- 根据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=1316MPEG-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=1316Native 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服务器中应用名(例如live 或 vod)。
- 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/myStreamRTP推流并生成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