FFPlay命令全集合
FFPlay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。
ffplay工具下载并播放视频,可以辅助卡看流信息。
官网下载地址:http://ffmpeg.org/download.html#build-windows
下载build好的exe程序:
此处下载的是:ffmpeg-20200403-52523b6-win64-static.zip
下载后解压,ffplay.exe就在文件夹bin中
1 FFPlay
打开命令窗口,进入ffplay.exe的目录中:或者把bin添加到环境变量
命令参考:https://www.cnblogs.com/renhui/p/8458802.html
格式:ffplay [选项] [‘输入文件’] 参考以上链接说明
1.1 播放视频
ffplay http://mp4.res.hunantv.com/mediafiles/wiad_creative/532/1469975702.mp4
可以本地也可以网络流。
播放网络流:
ffplay rtsp://xxxxxxxxxxxx进行播放
1.2 播放音频
播放mp3
ffplay shy.mp3
播放pcm
ffplay -ar 44100 -ac 1 -f s16le -i xxx.pcm
各个参数:
-ar 表示采样率
-ac 表示音频通道数
单声道是 1,Android 中为 AudioFormat.CHANNEL_IN_MONO
双声道是 2,Android 中为 AudioFormat.CHANNEL_IN_STEREO
-f 表示 pcm 格式,sample_fmts + le(小端)或者 be(大端)
sample_fmts可以通过ffplay -sample_fmts来查询
-i 表示输入文件,这里就是 pcm 文件
1.3 播放日志等级设置
loglevel参数控制:
ffplay -loglevel trace http://mp4.res.hunantv.com/mediafiles/wiad_creative/532/1469975702.mp4
想要更详细看到日志,可以看到请求头和网络包
对应源码定义类型:
每个级别定义的数值代表了严重程度,数值越小代表越严重。
默认的级别是AV_LOG_INFO。
此外,还有一个级别不输出任何信息,即AV_LOG_QUIET
1.4 ffplay音画同步
ffplay也是一个视频播放器,所以不得不提出来的一个问题是:音画同步。ffplay的音画同步的实现方式其实有三种,分别是:以音频为主时间轴作为同步源,以视频为主时间轴作为同步源,以外部时钟为主时间轴作为同步源。
首先需要说明的是,播放器接收到的视频帧或者音频帧,内部都是会有时间戳(PTS时钟)来标识它实际应该在什么时刻展示,实际的对齐策略如下:
比较视频当前的播放时间和音频当前的播放时间,如果视频播放过快,则通过加大延迟或者重复播放来降低视频播放速度,如果视频播放满了,则通过减小延迟或者丢帧来追赶音频播放的时间点。
关键就在于音视频时间的比较和延迟的计算,当前在比较的过程中会设置一个阈值,如果超过预设的阈值就应该作出调整(丢帧或者重复渲染),这就是整个对齐策略。
在使用ffplay的时候,我们可以明确的指定使用那种对齐方式,比如:
ffplay pm.mp4 -sync audio
上面这个命令显式的指定了使用以音频为基准进行音视频同步的方式播放视频文件,当然这也是ffplay的默认播放设置。
ffplay pm.mp4 -sync video
上面这个命令显式的指定了使用以视频为基准进行音视频同步的方式播放视频文件。
ffplay pm.mp4 -sync ext
上面这个命令显式的指定了使用外部时钟为基准进行音视频同步的方式播放视频文件
2 FFMpeg命令
主要是视频流转换输出用
命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg [[options][`-i’ input_file]]… {[options] output_file}…
1、参数选项:
(1) -an: 去掉音频
(2) -acodec: 音频选项, 一般后面加copy表示拷贝
(3) -vcodec:视频选项,一般后面加copy表示拷贝
2、格式:
(1) h264: 表示输出的是h264的视频裸流
(2) mp4: 表示输出的是mp4的视频
(3)mpegts: 表示ts视频流
2.1 转流
H264视频转ts视频流
ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts
H264视频转mp4
ffmpeg -i test.h264 -vcodec copy -f mp4 test.mp4
ts视频转mp4
ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 test.mp4
mp4视频转flv
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv test.flv
2.2 转音频
转MP3为wav
ffmpeg -i input.mp3 -acodec pcm_s16le -ac 2 -ar 44100 output.wav
m4a为wav
ffmpeg -i input.m4a -acodec pcm_s16le -ac 2 -ar 44100 output.wav
wav与PCM的相互转换
ffmpeg -i input.wav -f s16le -ar 44100 -acodec pcm_s16le output.raw
PCM转wav
ffmpeg -f s16le -ar 44100 -ac 2 -acodec pcm_s16le -i input.raw output.wav
ffmpeg -i ad.m4a -ar 48000 -ac 2 -f s16le ad_48000_2_s16le.pcm
ffmpeg -i ad.m4a -ar 48000 -ac 2 -f s16le ad_48000_2_s16le.pcm
aac to ac3:
ffmpeg -i audio.aac -acodec ac3 audio.ac3
ffmpeg -i input.wav -acodec ac3 output.ac3
提取左右声道的视频
ffmpeg -i ad.mp4 -af “pan=stereo|c1=FR” -y ad-right.mp4
ffmpeg -i ad.mp4 -af “pan=stereo|c0=FL” -y d-left.mp44
2.3 拉流
网络流转本地文件:
ffmpeg -i http://www.xxx.com/xxx.m3u8 name.mp4
ffmpeg强制使用TCP方式处理rtsp流 ,输出都cc.ts
ffmpeg -rtsp_transport tcp -i rtsp://182.131.121.48:12059/CMSBK/0021.ts cc.ts
2.4 推流
本机推流:UDP封装的MPEG-TS
ffmpeg -re -i sintel.ts -f mpegts udp://127.0.0.1:8880
ffmpeg -stream_loop 3 -re -i D:\apache\Apache24\htdocs\chongsheng1.mp4 -f mpegts udp://172.31.10.9:8880
本机推流:首先经过RTP封装,然后经过UDP封装的MPEG-TS
ffmpeg -re -i sintel.ts -f rtp_mpegts udp://127.0.0.1:8880
ffmpeg -stream_loop 3 -re -i D:\apache\Apache24\htdocs\chongsheng1.mp4 -f rtp_mpegts udp://172.31.10.9:8880
本地推流:RTP协议流(视频流)
ffmpeg -re -i D:\apache\Apache24\htdocs\chongsheng1.mp4 -c:v copy -an -f rtp_mpegts rtp://172.31.10.9:8881
本地推流:RTP协议流(音频流)
ffmpeg -re -i D:\apache\Apache24\htdocs\chongsheng1.mp4 -vn -acodec copy -f rtp_mpegts rtp://172.31.10.9:8881
本地推流:RTP协议流(音视频流)
参考:https://www.codenong.com/cs106467422/
ffmpeg -re -i D:\apache\Apache24\htdocs\chongsheng1.mp4 -c:v copy -an -f rtp_mpegts rtp://172.31.10.9:8881 -vn -acodec copy -f rtp rtp://172.31.10.9:8882
2.3 抽帧
每隔10秒抽帧:
ffmpeg -skip_frame nokey -i D:\videos\jljt_hevc_aac_60fps.ts -vf select=‘not(mod(floor(t-start_t),10))+gt(t-start_t,selected_n*10)’,scale=128:72,tile=8x8 -an -vsync 0 keyframes%03d.png
每隔5秒抽帧:
ffmpeg -skip_frame nokey -i http://xxxx.m3u8 -vf select=‘(isnan(prev_selected_t)+gte(t-prev_selected_t,5))(not(mod(floor(t-start_t),10))+gt(floor(t-start_t),selected_n10))’,scale=400:200,tile=6x6 -an -vsync 0 vod_new/test3_1/%d.jpg
2.5 图像转换
图片转yuv:
ffmpeg -i C:\Users\Administrator\Desktop\screenshot1.png -s 1920x1080 -pix_fmt yuvj420p C:\Users\Administrator\Desktop\screenshot1.yuv
yuv转JPG:
ffmpeg -pix_fmt yuvj420p -s 1920x1080 -i C:\Users\Administrator\Desktop\screenshot1.yuv C:\Users\Administrator\Desktop\b.jpg
2.6 编码
YUV编码H264:
ffmpeg -s 1920x1080 -i src01_1920x1080.yuv -b:v 7776k -r 25 -vcodec libx264 -x264opts ssim src01_1920x1080_0.150.h264
YUV编码mpg:
ffmpeg -s 1920x1080 -i src01_1920x1080.yuv -b:v 7776k -r 25 -vcodec mpeg2video src01_1920x1080_0.150.mpg
2.7 MP4转H264
ffmpeg -i D:\zhibo\video\douyin.mp4 -vcodec copy -bsf h264_mp4toannexb -f h264 douyin.h264
说明:
-i douyin.mp4 :是输入的MP4文件
-vcodec copy:从MP4封装中进行拷贝
-bsf h264_mp4toannexb:从MP4拷贝到annexB封装
-f h264:采用h.264格式
douyin:输出的文件名称
ffmpeg.exe -i http://mobaliyun.res.mgtv.com/new_video/2022/05/10/1295/60DF4C8228F500CE5584E23968DE2739_20220510_1_1_1241.mp4?sftc=vnds1_vtp4 -vcodec copy -bsf h264_mp4toannexb -f h264 douyin.h264
H264转Mp4
ffmpeg -i test.264 -vcodec copy -f mp4 test.mp4
2.8 H264 转YUV
ffmpeg -i src01_1920x1080_0.150.h264 src01_1920x1080_0.150_264.yuv
ffmpeg -i src01_1920x1080_0.150.mpg src01_1920x1080_0.150_mpg2.yuv
2.9 图片和yuv 转换
ffmpeg -s 1280x720 -pix_fmt yuv420p -i yuv420p_1280x720.yuv -pix_fmt rgb24 rgb24_1280x720.rgb
ffplay -pixel_format rbg24 -video_size 1280x720 -i rgb24_1280x720.rgb
ffmpeg -i a.jpg -s 640x480 -pix_fmt yuv422p a.yuv
ffmpeg -pix_fmt yuv422p -s 640x480 -i a.yuv b.jpg
3 推流
3.1 打包成HLS点播流
ffmpeg -i ad.mp4 -c:v libx264 -c:a copy -f hls m3u8\ad.m3u8
打包后的流放到服务器即可访问
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:1.920000,
ad1.ts
#EXTINF:3.680000,
ad2.ts
#EXTINF:2.560000,
ad3.ts
#EXTINF:1.800000,
ad4.ts
#EXTINF:1.680000,
ad5.ts
#EXT-X-ENDLIST
-segment_time每隔十秒切一个文件
ffmpeg -i dnf.mp4 -codec:v libx264 -codec:a mp3 -map 0 -f ssegment -segment_format mpegts -segment_list video/index.m3u8 -segment_time 10 video/%03d.ts
4 获取帧信息
ffprobe -show_frames We_Are_Young.mp4 > frames.info
统计I帧数量
keyframe=1 : key frame
pict_type=I : I-frame
cat frames.info | grep “pict_type=I” |wc -l
统计视频帧数量
cat frames.info | grep “media_type=video” |wc -l
ffprobe -show_format -show_streams filename