ffmpeg/ffplay/ffprobe命令简单使用
ffplay使用
ffplay用于渲染音视频的
如播放视频
ffplay http://tb-video.bdstatic.com/tieba-video/15_4f104948e182a557c4eb651d9720a5ae.mp4
这时候会直接在新弹出的窗口上播放该视频,如果想要同时播放多 个文件,那么只需要在多个命令行下同时执行ffplay就可以了,在对比 多个视频质量的时候这是一个操作技巧,此外,如果按s键则可以进入 frame-step模式,即按s键一次就会播放下一帧图像。
播放音频
ffplay ~/Desktop/GALA.mp3
这时候会弹出一个窗口,一边播放MP3文件,一边将播放声音的语谱图画到该窗口上。针对该窗口的操作如下,点击窗口的任意一个位 置(右键),ffplay会按照点击的位置计算出时间的进度,然后跳(seek)到这个 时间点上继续播放;按下键盘上的右键会默认快进10s,左键默认后退 10s,上键默认快进1min,下键默认后退1min;按ESC键就是退出播放 进程;如果按w键则将绘制音频的波形图等。
语谱图 音频的波形图更多的ffplay命令介绍:
- 播放视频结束之后会从头再次播放,共循环播放10 次。
ffplay GALA.mp4 -loop 10
- 指定使用哪一路音频流或者视频流,表示播放视频中的第一路音频流,如果参数ast后面跟的是 2,那么就播放第二路音频流,如果没有第二路音频流的话,就会静音
ffplay ~/Desktop/8703.mov -ast 1
ffplay ~/Desktop/8703.mov -vst 1
表示播放视频中的第一路视频流,如果参数vst后面跟的是 2,那么就播放第二路视频流,但是如果没有第二路视频流,就会是黑 屏即什么都不显示。
开发工作中常用的几个命令
1.播放PCM裸数据
ffplay song.pcm -f s16le -channels 2 -ar 44100
这行命令其实就可以正常播放song.pcm了,当然,前提 是格式(-f)、声道数(-channels)、采样率(-ar)必须设置正确,如 果其中任何一项参数设置不正确,都不会得到正常的播放结果。
- 播放YUV420P格式的视频帧
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 texture.yuv
对于一帧视频帧,或者更直接来说一张PNG或者JPEG的图 片,直接用ffplay是可以显示或播放的,当然PNG或者JPEG都会在其头 部信息里面指明这张图片的宽高以及格式表示。若想让ffplay显示一张 YUV的原始数据表示的图片,那么需要告诉ffplay一些重要的信息,其 中包括格式(-f rawvideo代表原始格式)、表示格式(-pixel_format yuv420p)、宽高(-s 480*480)。
对于RGB表示的图像,其实是一样 的,命令如下:
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 texture.rgb
音画同步
视频播放器,不得不提的一个问题就是音画同步,在 ffplay中音画同步的实现方式其实有三种,分别是:以音频为主时间轴 作为同步源;以视频为主时间轴作为同步源;以外部时钟为主时间轴作 为同步源。下面就以音频为主时间轴来作为同步源来作为案例进行讲 解,这也是后面章节中完成视频播放器项目时要使用到的对齐策略,并 且在ffplay中默认的对齐方式也是以音频为基准进行对齐的,那么以音 频作为对齐基准是如何实现的呢?
首先要声明的是,播放器接收到的视频帧或者音频帧,内部都会有 时间戳(PTS时钟)来标识它实际应该在什么时刻进行展示。实际的对 齐策略如下:比较视频当前的播放时间和音频当前的播放时间,如果视 频播放过快,则通过加大延迟或者重复播放来降低视频播放速度;如果 视频播放慢了,则通过减小延迟或者丢帧来追赶音频播放的时间点。关 键就在于音视频时间的比较以及延迟的计算,当然在比较的过程中会设
置一个阈值(Threshold),若超过预设的阈值就应该做调整(丢帧渲染 或者重复渲染),这就是整个对齐策略。
对于ffplay可以明确指明使用的到底是哪一种具体的对齐方式,比 如:
指定了ffplay使用音频为基准进行音视频同步,用 来播放文件32037.mp4,当然这也是ffplay的默认设置
ffplay 8703.mp4 -sync audio
指定了使用以视频为基准进行音视频同步的方式播 放视频文件。
ffplay 8703.mp4 -sync video
指定了使用外部时钟作为基准进行音视频同步的方 式,用来播放视频文件。
ffplay 8703.mp4 -sync ext
ffprobe
- ffprobe查看一个音频的文件
ffprobe ~/Desktop/809.mp3
截屏2019-11-23下午9.50.30.png
- ffprobe查看一个视频的文件
ffprobe ~/Desktop/8703.mp4
截屏2019-11-23下午9.52.02.png
1)输出格式信息format_name、时间长度duration、文件 大小size、比特率bit_rate、流的数目nb_streams等。
ffprobe -show_format 8703.mp4
2)以JSON格式的形式输出具体每一个流最详细的信 息,视频中会有视频的宽高信息、是否有b帧、视频帧的总数目、视频 的编码格式、显示比例、比特率等信息,音频中会有音频的编码格式、 表示格式、声道数、时间长度、比特率、帧的总数目等信息。
ffprobe -print_format json -show_streams 8704.mp4
3)显示帧信息的命令
ffprobe -show_frames sample.mp4
4)查看包信息的命令
ffprobe -show_packets sample.mp4
ffmpeg使用
(1)剪切一段媒体文件,可以是音频或者视频文件
将文件input.mp4从第50s开始剪切20s的时间,输出到文件 output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长 (duration)。
ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
(2)视频文件切割为多个文件
ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
(3)提取一个视频文件中的音频文件
ffmpeg -i input.mp4 -vn -acodec copy output.m4a
(4)使一个视频中的音频静音,即只保留视频
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
(5)从MP4文件中抽取视频流导出为裸H264数据
ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
(6)使用AAC音频数据和H264的视频生成MP4文件
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f
mp4 output.mp4
(7)音频文件的编码格式做转换
ffmpeg -i input.wav -acodec libfdk_aac output.aac
(8)从WAV音频文件中导出PCM裸数据
导出用16个bit来表示一个sample的PCM数据了,并且每 个sample的字节排列顺序都是小尾端表示的格式,声道数和采样率使用 的都是原始WAV文件的声道数和采样率的PCM数据。
ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
(9)重新编码视频文件,复制音频流,同时封装到MP4格式的文件中
ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
(10)将一个MP4格式的视频转换成为gif格式的动图
按照分辨比例不动宽度改为100(使用VideoFilter的 scaleFilter),帧率改为10(-r),只处理前5秒钟(-t)的视频,生成 gif。
ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
(11)将一个视频的画面部分生成图片, 提取帧图片
每4秒钟截取一帧视频画面生成一张图片,生成的图片从 frames_0001.png开始一直递增下去。
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
(12)使用一组图片可以组成一个gif
ffmpeg -i frames_%04d.png -r 5 output.gif
(13)将两路声音进行合并,比如要给一段声音加上背景音乐
ffmpeg -i vocal.wav -i accompany.wav -filter_complex
amix=inputs=2:duration=shortest output.wav
(14)为视频增加水印效果
main_w代表主视频宽度, overlay_w代表水印宽度,main_h代表主视频高度,overlay_h代表水印高度。
ffmpeg -i input.mp4 -i changba_icon.png -filter_complex
'[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
(15)将一段视频推送到流媒体服务器上
rtmp://xxx代表流媒体服务器的地址,加上-re参数代 表将实际媒体文件的播放速度作为推流速度进行推送。
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
(16)将流媒体服务器上的流dump到本地
http://xxx/xxx.flv 代表一个可以访问的视频网络地 址,可按照复制视频流格式和音频流格式的方式,将文件下载到本地的 output.flv媒体文件中。
ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
ffmpeg编码支持查看
首先下载源码https://github.com/FFmpeg/FFmpeg, 切换到源码目录
(1)编码器支持
./configure --list-encoders
(2)解码器支持
./configure --list-decoders
(3)封装支持
FFmpeg的封装( Muxing)是指将压缩后的编码封装到一个容器格式中,如果要查
看FFmpeg源代码中都可以支持哪些容器格式,可以通过命令./configure --list-muxers查看
./configure --list-muxers
(4)解封装支持
FFmpeg的解封装(Demuxing)是指将读人的容器格式拆解开,将里面压缩的音频流、
视频流、字幕流、数据流等提取出来,如果要查看FFmpeg的源代码中都可以支持哪些输
人的容器格式,可以通过命令./configure --ist- demuxers来查看:
./configure --list-demuxers
(5)通信协议支持
FFmpeg不仅仅支持本地的多媒体处理,而且还支持网络流媒体的处理,支持的网络
流媒体协议相对来说也很全面,可以通过命令./configure --list- protocols查看
./configure --list-protocols
截屏2019-11-24下午7.18.52.png