美文网首页
ffmpeg/ffplay/ffprobe命令简单使用

ffmpeg/ffplay/ffprobe命令简单使用

作者: 冰三尺 | 来源:发表于2019-11-23 21:58 被阅读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

    相关文章

      网友评论

          本文标题:ffmpeg/ffplay/ffprobe命令简单使用

          本文链接:https://www.haomeiwen.com/subject/hylkwctx.html