ffmpeg/ffplay/ffprobe命令简单使用

2019-11-23  本文已影响0人  冰三尺

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命令介绍:

  1. 播放视频结束之后会从头再次播放,共循环播放10 次。
ffplay GALA.mp4 -loop 10
  1. 指定使用哪一路音频流或者视频流,表示播放视频中的第一路音频流,如果参数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)必须设置正确,如 果其中任何一项参数设置不正确,都不会得到正常的播放结果。

  1. 播放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

  1. ffprobe查看一个音频的文件
ffprobe ~/Desktop/809.mp3
截屏2019-11-23下午9.50.30.png
  1. 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
上一篇下一篇

猜你喜欢

热点阅读