[TOC]
开始前的BB
这三个工具来说 ffplay和ffmpeg是很经典的两个,ffprobe日常用的比较少,ffplay和ffmpeg那可真是日常使用,下面只列举了一些平常经常用到的命令行,以及ffmpeg命令行帮助的方法
码农第三滚坑委提醒您:装逼千万条,基础第一条;不敲命令行,脸上两行泪
请先系好安全带以及准备一个视频文件(温馨提示 最好找个比较好看点的视频,因为调试过程中会一直直直直直直看到这个视频,换视频又太费时间,所以我建议大家开始的时候找个一比较耐看的视频 比如 点击下载)
温馨提示 请用命令行进入ffmpeg下载解压后的目录的bin目录下,比如:
飙车ing...
帮助命令
帮助命令的帮助
ffmpeg -h
这个是最简单的帮助命令
中间的部分是每个组件的详细版本号
usage 是说明使用ffmpeg命令行的格式,也就是 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
简单来讲就是
ffmpeg [一些选项] [[输入文件的选项] -i 输出文件的路径] {[输出文件的选项] 输出文件路径}
大家如果对于类Unix命令行不太熟悉,可以选择先记下这个格式,下面我们写的时候再看
获取帮助 -h 打印基本的选项 -h long 这个选项会打印的非常全,一般控制台显示不下 建议输出为文本看,比如ffmpeg -h full > ffmpeg_full.log
-h type=name 这个type的选项可以为decoder/encoder/demuxer/muxer/filter/bsf中的任意一个,name的话就是里面一个详细的格式,通过这个命令可以来查看是否支持指定格式,比如 ffmpeg -h decoder=h264
查看支持的formats/decoders
查看支持的formats/decoders等:
//支持的封装格式(合并&&分离)
ffmpeg -formats
//合并
ffmpeg -muxers
//分离
ffmpeg -demuxers
//支持的过滤器
ffmpeg -filters
//支持的编解码器
ffmepg -codecs
//支持的解码器
ffmpeg -decoders
//支持的编码器
ffmpeg -encoders
//支持的硬编解列表
ffmpeg -hwaccels
//位流格式
ffmpeg -bsfs
//像素格式
ffmpeg -pix_fmts
//采样格式
ffmpeg -sample_fmts
复制代码
查看具体支持某一种格式,类似这样
ffmpeg -h muxer=flv
复制代码
如果不支持 就是unknown了
其他的还有
ffmpeg -h filter=atempo
ffmpeg -h encoder=libx264
复制代码
之类
帮助的用法大概就是这样
FFPlay
命令格式
ffplay 是一个播放器 他的命令格式为: ffplay [options] [input_url]
主要命令
主要选项有
选项 说明
-x width 强制显示宽带。
-y height 强制显示高度。
-s size 帧尺寸 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频。该参数已经被废弃,请尝试用-video_size代替
-fs 以全屏模式启动。
-an 禁用音频(不播放声音)
-vn 禁用视频(不播放视频)
-sn 禁用字幕(不显示字幕)
-ss pos 根据设置的秒进行定位拖动,注意时间单位:比如'55' 55 seconds, '12:03:45' ,12 hours, 03 minutes and 45 seconds, '23.189' 23.189 second
-t duration 设置播放视频/音频长度,时间单位如 -ss选项
-bytes 按字节进行定位拖动。
-seek_interval interval 自定义左/右键定位拖动间隔(以秒为单位),默认值为10秒
-nodisp 关闭图形化显示窗口,视频将不显示
-noborder 无边框窗口
-volume vol 设置起始音量。音量范围[0 ~100]
-f fmt 强制使用设置的格式进行解析。比如-f s16le
-window_title title 设置窗口标题(默认为输入文件名)
-loop number 设置播放循环次数
-showmode mode 设置显示模式,可用的模式值:0 显示视频,1 显示音频波形,2 显示音频频谱。缺省为0,如果视频不存在则自动选择2
-vf filtergraph 设置视频滤镜
-af filtergraph 设置音频滤镜
复制代码
高级命令
高级选项
-pix_fmt format 格式设置像素格式。此选项已被弃用,有利于私有选项,try -pixel_format
-stats 打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值。默认情况下处于启用状态,要显式禁用它则需要指定-nostats。
-fast 非标准化规范的多媒体兼容优化
-genpts 生成pts。
-sync type 同步类型 将主时钟设置为audio(type=audio),video(type=video)或external(type=ext),默认是音频为主时钟。
-ast audio_stream_specifier 指定音频流索引,比如-ast 3,播放流索引为3的音频流
-vst video_stream_specifier 指定视频流索引,比如-vst 4,播放流索引为4的视频流
-sst subtitle_stream_specifier 指定字幕流索引,比如-sst 5,播放流索引为5的字幕流
-autoexit 视频播放完毕后退出。
-exitonkeydown 键盘按下任何键退出播放
-exitonmousedown 鼠标按下任何键退出播放
-codec:media_specifier codec_name 强制使用设置的多媒体解码器,media_specifier可用值为a(音频), v(视频)和s字幕。比如-codec:v h265 强制视频采用h265解码
-acodec codec_name 强制使用设置的音频解码器进行音频解码
-vcodec codec_name 强制使用设置的视频解码器进行视频解码
-scodec codec_name 强制使用设置的字幕解码器进行字幕解码
-autorotate 根据文件元数据自动旋转视频。默认情况下启用,若需禁用则使用-noautorotate
-framedrop 如果视频不同步则丢弃视频帧。当主时钟非视频时钟时默认开启。若需禁用则使用 -noframedrop
-infbuf 不限制输入缓冲区大小。尽可能快地从输入中读取尽可能多的数据。播放实时流时默认启用,如果未及时读取数据,则可能会丢弃数据。此选项将不限制缓冲区的大小。若需禁用则使用-noinfbuf
复制代码
播放控制
播放控制
选项 说明
q, ESC 退出播放
f 全屏切换
p, SPC 暂停
m 静音切换
9, 0 9减少音量,0增加音量
/, * /减少音量,*增加音量
a 循环切换音频流
v 循环切换视频流
t 循环切换字幕流
c 循环切换节目
w 循环切换过滤器或显示模式
s 逐帧播放
left/right 向后/向前拖动10秒
down/up 向后/向前拖动1分钟
page down/page up 拖动上一个/下一个。或者如果没有章节向后/向前拖动10分钟。
鼠标右键单击 拖动与显示宽度对应百分比的文件进行播放
鼠标左键双击 全屏切换
复制代码
举个??
BB这么多 来几个使用的例子
播放本地文件
最直接的: ffplay test_video.mp4
这边我们看到,在命令行里输出里一些有关视频的信息,在新的窗口里已经播放出来了视频
我们加上一些上面的参数后 也可以这种播 ffplay -window_title "mirs ffplay" -ss 2 -t 10 -autoexit test.mp4
效果大家自己去根据上面的提示和自己实际动手操作一下,我这就不说了
播放网络流
食用方式与楼上一样
ffplay rtmp://live.hkstv.hk.lxdns.com/live/hks1
(偷懒是真滴舒服)
视频旋转播放
ffplay -i test_video.mp4 -vf transpose=1
视频反转播放
(镜面) ffplay test_video.mp4 -vf hflip
(上下) ffplay test_video.mp4 -vf vflip
ps:视频旋转和反转可以组合食用 (听说巧克力和牛奶更配哟)
变速播放
音频变速视频不变速 (1.5倍食用更佳)
ffplay -i test_video.mp4 -af atempo=1.5
视频变速音频不变速
ffplay -i test_video.mp4 -vf setpts=PTS/1.5
音视频一起变速(3倍!!!)
ffplay -i test_video.mp4 -vf setpts=PTS/3 -af atempo=3
效果自己运行看 (留个疑问 根据参数猜原理)
FFmpeg
终于到ffmepg了,我们首先来吧他常用的参数分个类
常用参数
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
-t 时间长度
视频参数:
-vframes 设置要输出的视频帧数
-b 设定视频码率,默认为200Kbit/s
-b:v 视频码率
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
-vf 视频滤波器
音频参数:
-aframes 设置要输出的音频帧数
-b:a 音频码率
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
-af 音频滤波器
复制代码
使用示例
分离视频音频流
分离音频 ffmpeg -i test_video.mp4 -acodec copy -vn audio.aac
然后...
分离视频 ffmpeg -i test_video.mp4 -vcodec copy -an video.mp4
提取H264
ffmpeg -i test_video.mp4 -vcodec copy -an test_copy.264
提取AAC
ffmpeg -i test_video.mp4 -acodec copy -vn test.aac
改变编码格式
ffmpeg -i test_video.mp4 -vcodec copy -acodec copy test_copy.ts
修改帧率
ffmpeg -i test_video.mp4 -r 15 output.mp4
修改码率
ffmpeg -i test_video.mp4 -b:v 1.5M output2.mp4
修改音频码率
ffmpeg -i test_video.mp4 -b:a 192k output2.mp4
修改音视频码率
ffmpeg -i test_video.mp4 -b:v 1.5M -b:a 192k output2.mp4
修改分辨率
ffmpeg -i test_video.mp4 -s 640x480 output.mp4
提取PCM
ffmpeg -i test.mp4 -f s16le audio.pcm
提取YUV
提取3秒 分辨率和原来的一致 ffmpeg -i test_video.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv
提取3秒 指定分辨率 ffmpeg -i test_video.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
提取RGB
提取3秒数据,分辨率转为320x240 ffmpeg -i test_video.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
RGB和YUV转换
ffmpeg -s 968x544 -pix_fmt yuv420p -i yuv420p_orig.yuv -pix_fmt rgb24 orig.rgb
常用的命令和选项基本都在这边了,可以根据自己的需求去选择不同的命令行实现功能
接下来,我们就开始着手自己写一个视频播放器了(想想是不是还有点小激动)
未完持续。。。