(本文基本逻辑:ffmpeg 常用命令介绍 ffplay 常用命令介绍 ffprobe 常用命令介绍)
从事音视频开发的程序员几乎都应该知道或使用过 FFmpeg。FFmpeg 是一个开源软件,采用 LGPL 或 GPL 许可证(需要注意这里的开源协议,它具有『传染性』,会要求它的使用方也开源)。我们可以使用 FFmpeg 来进行多种格式音频和视频的录制、转换、流处理功能。
FFmpeg 由多个组件组成,包含了命令行应用程序以及一系列函数库:
如果你使用 Mac 设备,在 Mac 上安装 FFmpeg 可以用 Homebrew:
$ brew install ffmpeg
至于 Homebrew 的安装,以及使用它安装 ffmpeg 的相关细节,这里就不做过多探讨了。
本文主要介绍 FFmpeg 命令行应用程序的使用,这是我们在音视频开发中必不可少的工具。
ffmpeg 是一个音视频编解码、格式转换以及音视频流内容处理的工具。
通过下列命令可以查看当前 ffmpeg 工具所支持的能力:
// 获取帮助$ ffmpeg -help// 支持的格式$ ffmpeg -formats// 支持的解码$ ffmpeg -decoders// 支持的编码$ ffmpeg -encoders// 支持的协议$ ffmpeg -protocols
可以使用下列命令来转封装:
$ ffmpeg -i <输入文件路径> -c copy -f <输出封装格式> <输入文件路径>
1)转 MP4
MP4 是当下短视频最常使用的封装格式。
FFmpeg 封装 MP4 常用参数:
示例:将 FLV 的文件转封装成 MP4 并将 moov box 移动到文件头部。
$ ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4
2)转 FLV
FLV 是当下实时直播最常使用的封装格式,关于 FLV 格式更详细的介绍,参见《FLV 格式》。
FFmpeg 封装 FLV 常用参数:
示例:将 MP4 的文件转封装成 FLV。
$ ffmpeg -i input.mp4 -c copy -f flv output.flv
FLV 封装中可以支持的音频编码和视频编码是有限的,在转封装的时候,如果音频或视频不符合标准时,会封装不了而报错。一般,我们可以在转封装的时候同时将音频和视频转码成 FLV 支持的格式。
示例:将 MP4 的文件转封装成 FLV 并确保音频转码为 AAC。
$ ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv
【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取FFmpegWebRTCRTMPRTSPHLSRTP鎾 斁鍣 -闊宠 棰戞祦濯掍綋楂樼骇寮 鍙 -璧勬枡棰嗗彇
3)转 HLS
HLS 是当下直播回放和部分实时直播场景最常使用的协议,它对应的媒体格式是 M3U8 + TS,关于 HLS 更详细的介绍,参见《HLS 协议》、《M3U8 格式》、《TS 格式》。
FFmpeg 封装 HLS 常用参数:
示例:将 MP4 的文件转封装成 HLS 直播。
$ ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8
因为默认是 HLS 直播,所以生成的 M3U8 文件内容会随着切片的产生而更新。这里多了一个 -bsf:v h264_mp4toannexb 参数,它的作用是将 MP4 中的 H.264 数据转换为 H.264 AnnexB 标准的编码,AnnexB 标准的编码常见于实时传输流中。如果源文件为 FLV、TS 等可作为直播传输流的视频,则不需要这个参数。
4)音视频流抽取
FFmpeg 除了转封装、转码之外,还可以提取音频流和视频流。
示例:从 MP4 文件中提取 AAC 音频流。
$ ffmpeg -i input.mp4 -vn -acodec copy output.aac
示例:从 MP4 文件中提取 H.264 视频流。
$ ffmpeg -i input.mp4 -an -vcodec copy output.h264
示例:从 MP4 文件中提取 H.265 视频流。
$ ffmpeg -i input.mp4 -an -vcodec copy -bsf hevc_mp4toannexb -f hevc output.hevc
FFmpeg 一般使用 libx264 来进行软编码。下面是 x264 相关的编码参数:
1)Preset
示例:设置 preset 预设参数为 ultrafast 进行转码。
$ ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
2)Profile
示例:设置 profile 为 high 进行转码。
$ ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 720x1280 -an -y -t 10 output_high.ts
使用 main profile 和 high profile 编码出来的视频是可以包含 B 帧的,转码完后,可以看一下:
$ ffprobe -v quiet -show_frames -select_streams v output_high.ts | grep "pict_type=B" | wc -l
3)GOP
示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧。
$ ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 -y output.mp4
4)B 帧
由于设置 x264 的参数比较多,所以 FFmpeg 开放了 x264opts 来设置 x264 内部的私有参数。
示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧,且不出现 B 帧。
$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4
示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧,且 2 个 P 帧之间存放 3 个 B 帧。
$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4
5)码率
编码时能够设置 VBR、CBR 编码模式,VBR 表示可变码率,CBR 表示恒定码率。
示例:
$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 -t 60 -y output.ts
上面的命令比较复杂,分别做了这些事:
1)发布 RTMP 流
RTMP 是当下实时直播最常使用的推流协议,关于 RTMP 协议更详细的介绍,参见《RTMP 协议》。
FFmpeg 操作 RTMP 直播流使用的参数:
示例:本地 MP4 视频文件转封装为 FLV 后推流至指定 RTMP 流媒体服务器。
$ ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/room
2)录制 RTMP 流
示例:RTMP 媒体流保存为 FLV 视频文件。
$ ffmpeg -i rtmp://localhost:1935/live/room -c copy output.flv
3)录制 HTTP 流
在流媒体服务中,HTTP 服务是最为常见的,尤其是点播。直播也是可以的,包括 HTTP-FLV、HTTP-TS、HLS。
FFmpeg 操作 HTTP 使用的参数:
示例:拉取并录制 FLV 直播流。
$ ffmpeg -i http://www.abc.com/live.flv -c copy -f flv output.flv
示例:拉取 TS 直播流流录制为 FLV。
$ ffmpeg -i http://www.abc.com/live.ts -c copy -f flv output.flv
示例:拉取 HLS 直播流流录制为 FLV。
$ ffmpeg -i http://www.abc.com/live.m3u8 -c copy -f flv output.flv
ffplay 是基于 SDL 与 ffmpeg 库实现的一个播放器,可以使用它来播放原始的 YUV/PCM 数据、编码后的 H.264/H.265 等数据,封装好的 MP4/M4A 等数据,或是流媒体数据。
1)播放原始声音数据
$ ffplay -f <格式名> -ac <声道数> -ar <采样率> -i <文件路径>
其中,-f 表示 PCM 格式,可以用 ffmpeg -formats | grep PCM 命令查看当前支持的格式。
示例:
$ ffplay -f f32le -ac 1 -ar 48000 -i input.pcm
2)播放原始图像数据
$ ffplay -f <文件格式> -pixel_format <像素格式> -video_size <视频尺寸> -i <文件路径>
其中,-pixel_format 表示像素格式,可以用 ffplay -pix_fmts 命令开查看当前支持的格式。
示例:
$ ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 -i input.yuv
3)播放编码数据
使用 ffplay 播放编码后的视频或音频文件如下所示:
$ ffplay -i <文件路径>
示例:
$ ffplay -i input.h264
4)播放封装数据
使用 ffplay 播放封装好的视频或音频文件如下所示:
$ ffplay -i <文件路径>
示例:
$ ffplay -i input.mp4
不过,这里还有一些可能会用到的功能可以关注一下:
4.1)播放控制
在播放音频或视频时,使用下列键盘按键可以进行播放控制:
4.2)循环播放
通过 -loop 指定循环次数。
$ ffplay -loop <循环播放次数> -i <文件路径>
4.3)播放某一路音频或视频
通过 -ast 和 -vst 分别指定音频流和视频流编号。
$ ffplay -ast <音频流编号> -i <文件路径>$ ffplay -vst <视频流编号> -i <文件路径>
如果不存在对应编号的音频流或视频流,则静音或没有画面。
4.4)设置音视频同步方式
通过 -sync 指定音视频同步方式。
$ ffplay -sync <同步方式> -i <文件路径>
其中同步方式有 3 种,包括:
ffprobe 是 FFmpeg 源码编译后生成的一个可执行程序。ffprobe 是一个很强大的多媒体分析工具,它可以从媒体文件或媒体流中获得音视频及媒体容器的参数信息。
1)查看媒体封装信息
使用 -show_format 来查看媒体封装信息。
$ ffprobe -show_format <文件路径>
下面是输出信息示例及字段含义说明:
[FORMAT]filename=http://www.example.com/1.flvnb_streams=2nb_programs=0format_name=flvformat_long_name=FLV (Flash Video)start_time=4088.213000duration=0.000000size=N/Abit_rate=N/Aprobe_score=100TAG:fileSize=0TAG:audiochannels=2TAG:encoder=xxx[/FORMAT]
2)查看媒体流信息
使用 -show_streams 来查看媒体流信息。
$ ffprobe -show_streams <文件路径>
下面是输出信息示例及字段含义说明:
[STREAM]index=0codec_name=h264codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10profile=Highcodec_type=videocodec_time_base=1/30codec_tag_string=[0][0][0][0]codec_tag=0x0000width=720height=1280coded_width=720coded_height=1280has_b_frames=1sample_aspect_ratio=N/Adisplay_aspect_ratio=N/Apix_fmt=yuv420plevel=31color_range=unknowncolor_space=unknowncolor_transfer=unknowncolor_primaries=unknownchroma_location=leftfield_order=progressivetimecode=N/Arefs=1is_avc=truenal_length_size=4id=N/Ar_frame_rate=15/1avg_frame_rate=15/1time_base=1/1000start_pts=1030start_time=1.030000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=8nb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM][STREAM]index=1codec_name=aaccodec_long_name=AAC (Advanced Audio Coding)profile=LCcodec_type=audiocodec_time_base=1/48000codec_tag_string=[0][0][0][0]codec_tag=0x0000sample_fmt=fltpsample_rate=48000channels=2channel_layout=stereobits_per_sample=0id=N/Ar_frame_rate=0/0avg_frame_rate=0/0time_base=1/1000start_pts=55start_time=0.055000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=N/Anb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM]
视频流:
[SIDE_DATA]// side_data 数据类型,Display Matrix 表示一个 3*3 的矩阵,这个矩阵需要应用到解码后的视频帧上,才能正确展示:side_data_type=Display Matrixdisplaymatrix=00000000: 0 65536 000000001: -65536 0 000000002: 0 0 1073741824// 顺时针旋转 90 度还原视频rotation=-90[/SIDE_DATA]
音频流:
3)查看媒体数据包信息
使用 -show_streams 来查看媒体数据包信息。
$ ffprobe -show_packets <文件路径>
下面是输出信息示例及字段含义说明:
[PACKET]codec_type=audiostream_index=0pts=1690083pts_time=1690.083000dts=1690083dts_time=1690.083000duration=23duration_time=0.023000convergence_duration=N/Aconvergence_duration_time=N/Asize=470pos=2757652flags=K_[/PACKET][PACKET]codec_type=videostream_index=1pts=1690232pts_time=1690.232000dts=1690099dts_time=1690.099000duration=33duration_time=0.033000convergence_duration=N/Aconvergence_duration_time=N/Asize=11253pos=2758139flags=__[/PACKET]
4)查看媒体帧信息
使用 -show_frames 来查看媒体帧信息。
$ ffprobe -show_frames <文件路径>
下面是输出信息示例及字段含义说明:
[FRAME]media_type=videostream_index=1key_frame=0pkt_pts=2084699pkt_pts_time=2084.699000pkt_dts=2084699pkt_dts_time=2084.699000best_effort_timestamp=2084699best_effort_timestamp_time=2084.699000pkt_duration=33pkt_duration_time=0.033000pkt_pos=3751477pkt_size=2665width=720height=1280pix_fmt=yuv420psample_aspect_ratio=N/Apict_type=Bcoded_picture_number=334display_picture_number=0interlaced_frame=0top_field_first=0repeat_pict=0color_range=unknowncolor_space=unknowncolor_primaries=unknowncolor_transfer=unknownchroma_location=left[/FRAME][FRAME]media_type=audiostream_index=0key_frame=1pkt_pts=2084707pkt_pts_time=2084.707000pkt_dts=2084707pkt_dts_time=2084.707000best_effort_timestamp=2084707best_effort_timestamp_time=2084.707000pkt_duration=23pkt_duration_time=0.023000pkt_pos=3775354pkt_size=472sample_fmt=fltpnb_samples=1024channels=2channel_layout=stereo[/FRAME]
视频帧:
音频帧:
页面更新:2024-05-30
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号