⑴ FFmpeg命令行使用
FFmpeg的命令非常多,经常看着会云里雾里的,个人认为没必要去硬背,只要打开Terminal,输入 ffmpeg -help 命令,这条命令会告述你FFmpeg支持的大部分常用命令以及使用方式。查看这些输出的信息,基本上就会使用很多常用的命塌雀令了。 你会发现执行 ffmpeg -help 会输出一大坨,那都是些啥玩意呢,不着急,咱们一步一步来慢慢品尝。 第一个就是输出我们安装的FFmpeg的版本号 –prefix 是指FFmpeg的安装路径 –enable 是你安装的FFmpeg支持的三方库 这里可以看出支持 libx264 、 libx265 的编码,以及支持 videotoolbox , videotoolbox 是Mac、iOS上的一个系统自带硬编解码库,FFmpeg也给予了支持,非常的给力。 这是输出FFmpeg里面包含的库,这些都是独立的,是可以单独拎出来使用的,你如果只要编解码,那你就只要在项目中导入 libavcodec 即可 这是告诉我们命令行使用格式 [options] 这个是全局参数 [infile options] 这个是输入文件的参数 infile 这个是输入文件的路径 [outfile options] 这个是输出文件的参数 outfile 这个是输出文件的路径 细心的你肯定发现 infile 、 outfile 的后面有个 … ,这是在告诉我们输入、输出文件可以分别有一个或者多个。 比如执行 ffmpeg -i test.h264 -i test.aac -c test.mp4 这条命令会把一个h264文件和一个aac的音频文件合并并输出一个mp4格式的文件,这其中就团旦早有两个输入文件、一个输出文件。 这些是详细的帮助信息 -h long 打印更多的选项参数。 -h full 打印所有的选项参数,包括所有针对于 format 和 codec 的选项,信息特别的长。 man ffmpeg : 查看FFmpeg的帮助手册。 -h type=name 打印指定名称的 decoder/encoder/demuxer/muxer/filter 的所有选项信息。 比如你要查询 scale 滤镜的使用方式,我们就执行 ffmpeg -h filter=scale 输出如下: 这就告诉我们 scale 滤镜有 w 、 h 等参数,我们就这样使用 scale 滤镜, ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2h=ih/2" output.mp4 其中 iw 代表输入视频的宽, ih 代表输入视频的高,这条命令就把输入的视频缩小一倍,这里你可能会有疑问,我都不记得那些滤镜的名字,就无法使用这个去查了,哈哈不要急,还记得上面的帮助命令吗, ffmpeg -filters 可以输出所有的滤镜名字了,如果你觉的输出太多,你不好找的话,你只要记得这个滤镜大概是叫什么名字、包含什么字母,你就借助 grep 指令去输出里面搜索关键字,这样就只会输出你关心的滤镜名了,如 ffmpeg -filters | grep over 以上是帮助命令,如果你忘记了某个编译器、像素格式或者滤镜的名字,你就可以用这些命令去查看。 以上就是全局参数 以上是音视频的公共参数 以上是视频处理相关参数 以上是音频处理相关 以上字幕处理相关参数 以上就是迟洞 ffmpeg -help 的输出说明了,下面咱们来看看常用的命令。 -r 10 表示1秒视频会生成10张图片 -f avfoundation 指定采用avfoundation采集数据使用 -i 1:0 表示 指定视频设备索引为1,指定录音设备索引为0。 使用 ffmpeg -list_devices 1 -f avfoundation -i '' 可以打印出设备列表,如下: 因此上述命令中的 -i 1:0 表示采用【Capture screen 0】【Built-in Microphone】即采用屏幕和系统自带的麦克风进行采集。
⑵ FFmpeg功能命令汇总
前言如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流、更改音视频参数功能等。通过终端命令如何实现这些功能,Richy在本文做一记录,以备之后查阅。 注意:下面一一列举的命令,未归类整理,命令参数供参考。 如果参数有误,大家可对照文章- FFmpeg参数命令 ,进行修改。 第一组 1.分离视频音频流 ffmpeg -i input_file -vcodec -an output_file_video//分离视频流ffmpeg -i input_file -acodec -vn output_file_audio//分离音频流 2.视频解复用 ffmpeg –i test.mp4 –vcodec –an –f m4v test.264 ffmpeg –i test.avi –vcodec –an –f m4v test.264 3.视频转码 ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //转码为码流原始文件 ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //转码为码流原始文件 ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件 说明: -bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制 4.视频封装 ffmpeg –i video_file –i audio_file –vcodec –acodec output_file 5.视频剪切 ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片 ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi //剪切视频//-r 提取图像的频率,-ss 开始时间,-t 持续时间 6.视频录制 ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi 7、利用ffmpeg视频切片 主要把视频源切成若干个.ts格式的视频片段然后生成一个.m3u8的切片文件索引提供给html5的video做hls直播源 命令如下: ffmpeg -i 视频源地址 -strict -2 -c:v libx264 -c:a aac -f hls m3u8文件输出地址 8、ffmpeg缩放视频 假设原始视频尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以缩小到 480p: 命令如下: ffmpeg -i 视频源地址 -vf scale=853:480 -acodec aac -vcodec h264 视频输出地址(如:out.mp4) 各个参数的含义:-i a.mov 指定待处理视频的文件名-vf scale=853:480 vf 参数用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 853×480 px,其中的 853px 是计算而得,因为原始视频的宽高比为 16:9,所以为了让目标视频的高度为 480px,则宽度 = 480 x 9 / 16 = 853-acodec aac 指定音频使用 aac 编码。注:因为 ffmpeg 的内置 aac 编码目前(写这篇文章时)还是试验阶段,故会提示添加参数 “-strict -2” 才能继续,尽管添加即可。又或者使用外部的 libfaac(需要重新编译 ffmpeg)。-vcodec h264 指定视频使用 h264 编码。注:目前手机一般视频拍摄的格式(封装格式、文件格式)为 mov 或者 mp4,这两者的音频编码都是 aac,视频都是 h264。out.mp4 指定输出文件名上面的参数 scale=853:480 当中的宽度和高度实际应用场景中通常只需指定一个,比如指定高度为 480 或者 720,至于宽度则可以传入 “-1” 表示由原始视频的宽高比自动计算而得。即参数可以写为:scale=-1:480,当然也可以 scale=480:-1 9、ffmpeg裁剪 有时可能只需要视频的正中一块,而两头的内容不需要,这时可以对视频进行裁剪(crop),比如有一个竖向的视频 1080 x 1920,如果指向保留中间 1080×1080 部分命令如下:ffmpeg -i 视频源地址 -strict -2 -vf crop=1080:1080:0:420 视频输出地址(如:out.mp4) 其中的 crop=1080:1080:0:420 才裁剪参数,具体含义是 crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸,x:y 表示裁剪区域的左上角坐标。比如当前这个示例,我们只需要保留竖向视频的中间部分,所以 x 不用偏移,故传入0,而 y 则需要向下偏移:(1920 – 1080) / 2 = 420 10. 转视频格式 ffmpeng -i source.mp4 -c:v libx264 -crf 24 destination.flv 其中 -crf 很重要,是控制转码后视频的质量,质量越高,文件也就越大。 此值的范围是 0 到 51:0 表示高清无损;23 是默认值(如果没有指定此参数);51 虽然文件最小,但效果是最差的。 值越小,质量越高,但文件也越大,建议的值范围是 18 到 28。而值 18 是视觉上看起来无损或接近无损的,当然不代表是数据(技术上)的转码无损。 第二组 1.ffmpeg 把文件当做直播推送至服务器 (RTMP + FLV) ffmpeg – re -i demo.mp4 -c – f flv rtmp://w.gslb.letv/live/streamid 2.将直播的媒体保存到本地 ffmpeg -i rtmp://r.glsb.letv/live/streamid -c streamfile.flv 3.将一个直播流,视频改用h264压缩,音频改用faac压缩,送至另一个直播服务器 ffmpeg -i rtmp://r.glsb.letv/live/streamidA -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://w.glsb.letv/live/streamb 4.提取视频中的音频,并保存为mp3 然后输出 ffmpeg -i input.avi -b:a 128k output.mp3 第三组 1.获取视频的信息 ffmpeg -i video.avi 2.将图片序列合成视频 ffmpeg -f image2 -i image%d.jpg video.mpg 上面的命令会把当前目录下的图片(名字如:image1.jpg. image2.jpg. 等…)合并成video.mpg 3.将视频分解成图片序列 ffmpeg -i video.mpg image%d.jpg 上面的命令会生成image1.jpg. image2.jpg. … 支持的图片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI 4.为视频重新编码以适合在iPod/iPhone上播放 ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320×180 -title X final_video.mp4 5.为视频重新编码以适合在PSP上播放 ffmpeg -i source_video.avi -b 300 -s 320×240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4 6.从视频抽出声音.并存为Mp3 ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3 7.将wav文件转成Mp3 ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3 8.将.avi视频转成.mpg ffmpeg -i video_origine.avi video_finale.mpg 9.将.mpg转成.avi ffmpeg -i video_origine.mpg video_finale.avi 10.将.avi转成gif动画(未压缩) ffmpeg -i video_origine.avi gif_anime.gif 11.合成视频和音频 ffmpeg -i son.wav -i video_origine.avi video_finale.mpg 12.将.avi转成.flv ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320×240 -f flv video_finale.flv 13.将.avi转成dv ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv 或者: ffmpeg -i video_origine.avi -target pal-dv video_finale.dv 14.将.avi压缩成divx ffmpeg -i video_origine.avi -s 320×240 -vcodec msmpeg4v2 video_finale.avi 15.将Ogg Theora压缩成Mpeg dvd ffmpeg -i film_sortie_cinelerra.ogm -s 720×576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg 16.将.avi压缩成SVCD mpeg2 NTSC格式: ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg PAL格式: ffmpeg -i video_origine.avi -target pal-dvcd video_finale.mpg 17.将.avi压缩成VCD mpeg2 NTSC格式: ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg PAL格式: ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg 18.多通道编码 ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2 19.从flv提取mp3 ffmpeg -i source.flv -ab 128k dest.mp3 第四组 1、将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c -f flv rtmp://server/live/streamName 2、将直播媒体保存至本地文件 ffmpeg -i rtmp://server/live/streamName -c mp.flv 3、将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流 ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream 4、将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流 ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream 5、将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流 ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec -f flv rtmp://server/live/h264_AAC_Stream 6、将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变 ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k 7、功能一样,只是采用-x264opts选项 ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k 8、将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布 ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name 9、将一个JPG图片经过h264压缩循环输出为mp4视频 ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4 10、将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1) ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃 文/骚之哈塞给(作者)
⑶ linux 下怎么检测ffmpeg版本
你没说是系统系统版本的,不同版本之前命令也是不同的。给你红帽系统,也可以用作Centos查看的命令:命令 作用 yum repolist all 列出所有仓库。 yum list all 列出仓库中所有软件包 yum info 软件包名称 查看软件包信息 yum install 软件包名称 安装软件包 yum reinstall 软件包名称 重新安装软件包 yum update 软件包名称 升级软件包 yum remove 软件包 移除软件包 yum clean all 清除所有仓库缓存 yum check-update 检查可更新的软件包 yum grouplist 查看系统中已经安装的软件包组 yum groupinstall 软件包组 安装指定的软件包组 yum groupremove软件包组 移除指定的软件包组 yum groupinfo 软件包组 查询指定的软件包组信息
⑷ 怎么查看ffmpeg源码版本号
桌面上右键“打开终端”。 也可以使用ctrl+alt+t就可以打开终端窗口。启基 在里面输入查看版本的命令。 $ffmpeg -version 回车执行命令,我们冲旁尺会发现第一行就是ffmpeg的版本。 如果在windows系统下,我们可以WIN+R打开左散高下角的运行窗口,在里面输入cmd…
⑸ ffmpeg 硬件解码手册
https://trac.ffmpeg.org/wiki/HWAccelIntro如何查看硬件加速器 找ffmpeg3.2版本执行ffmpeg -hwaccelsqsv可以解码的类型有h264,h264/hevc,mpeg2,vc1 qsv解码里面已经自带了h264_mp4toannexb的码流转化器,需要先将mp4中的h264码率转换成annexb格式,再进行解码 如果对于非mp4文件中的码流,则绕过了纤春码流转化器。用qsv编码: ffmpeg -i INPUT -c:v h264_qsv -preset:v faster out.qsv.mp4用qsv解码 ffmpeg -hwaccel qsv -i INPUT -f null – -benchmarklinux下如何安装intel media sdk http://blog.csdn.net/nonmarking/article/details/46391767intel media sdk 2016 [支持intel 酷扮竖手睿 4,5代cpu] intel media sdk 2016 [支持intel 酷睿 6代cpu]硬件编码测试实验 ffmpeg -threads 64 -stream_loop -1 -s 1920×1080 -i out.yuv -c:v h264_qsv -f null out.264 在centos[i6700k] 能编码140fps 【cpu:20%,gpu:63%]在win7[hd4600,i5,4核心] 能编码85fps 【cpu:65,gpu:52%] nvenc decoder and encoder./ffmpeg -c:v h264_cuvid -i out.mp4 /tmp/out.yuv./厅嫌ffmpeg -threads 16 -f lavfi -i testsrc=size=1920×1080 -c:v h264_nvenc out.mp4如何测试并发编码
⑹ Mac M1芯片安装ffmpeg 以及使用
1 首先要安装brew 2 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 3 cd ffmpeg 4 执行脚本 ./configure –prefix=/opt/local 5 编译 make 6 安装 make install 7 安装成功,查看 ffmpeg版本 /opt/local/bin/ffmpeg -version 这样已经安装成功。 8 open /opt/缺银败local/bin/ 在此文件下,有2个关于ffmpeg的可执行文件9 例子:查询某音频文件详细信息 刚开始使用会出现 zsh: command not found:的提示。伏颤可能是cmd使用错误。 其实是使用错误了。搏念 ./ffprobe -show_format (更多关于ffprobe、ffmpeg 的使用请自行网络,这里不多说)
⑺ FFmpeg工具
ffmpeg在做音视频编解码时非常方便,所以很多场景下转码使用的是ffmpeg,通过ffmpeg –-help可以看到ffmpeg常见的命令大概分为六部分:
命令格式如下:
下面罗列一些ffmpeg常用的信息查询命令: 1、查询版本信息
2、ffmpeg查询是否支持对应的视频文件格式 使用ffmpeg转吗,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的ffmpeg是否支持对应的视频文件格式,需要使用ffmpeg -formats参数来查看:
根据上面输出的信息可以看到,输出的内容分为3个部分,具体如下。
输出信息中包含了三部分内容,具体如下。
输出信息的内容分为四列,具体如下。
从输出的帮助信息中可以看到,FLV的muxer的信息包含两大部分,具体如下。
从输出的帮助信息可以看到,FLV的demuxer的信息包含两大部分:
从帮助信息可以看到,H.264(AVC)的编码参数包含两大部分,具体如下。
从帮助信息可以看到,H.264(AVC)的解码参数查看包括两大部分,具体如下:
从帮助信息可以看到,colorkey滤镜查看信息包含两大部分,具体如下。
ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux操作;多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的操作参数中是公用的,下面来详细介绍一下这些公用的参数。 通过查看ffmpeg –help full信息,找到AVFormatContext参数部分,该参数下的所有参数均为封装转换可使用的参数。下表列出了ffmpeg AVFormatContext的主要参数及说明。
这些都是通用的封装、解封装操作时使用的参数,后续章节中介绍转封装操作、解封装操作、封装操作时,上述参数可以与对乱如让应的命令行参数搭配使用。
ffmpeg编解码部分的功能主要是通过模块AVCodec来完成的,通过libavcodec库进行Encode与Decode操作。多媒体哗局编码格式的种类有很多,但是还是有很多通用的基本操作参数设置,下面来详细介绍这些公用的参数。 通过命令ffmpeg –help full可以看到AVCodecContext参数列表信息。该选项下面的所有参数均为编解码可以使用的参数。
ffmpeg还有一些更细化的参数,本节中并未详细提及,可以根据本节中提到的查看方法查看ffmpeg的帮助文件以查看更多的内容,本节中介绍的是重点及常用的通用参数,后续章节中介绍编码操作时,上述参数可以配合对应的例子使用。
ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码操作,使用ffmpeg转码的主要原橡袭理如图
通过之前介绍的参数,可以设置转码的相关参数,如果转码操作频涉及封装的改变,则可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变,下面示例:
从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。
在 FFmpeg套件中,除了ffmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息,下面就来看一下ffprobe中常见的基本命令。 usage: ffprobe [OPTIONS] [INPUT_FILE] the other ffprobe常用的参数比较多,可以通过ffprobe –help来查看详细的帮助信息。 这些输出的帮助信息既是ffprobe常用的操作参数,也是ffrpobe的基础参数。例如查看log,查看每一个音频数据包信息或者视频数据包信息,查看节目信息,查看流信息,查看每一个流有多少帧以及每一个流有多少个音视频包,查看视频像素点的格式等。下面就来根据以上的输出参数重点列举几个例子。 1)使用下面的命令,查看多媒体数据包信息:
通过show_packets查看的多媒体数据包信息使用PACKET标签括起来,其中包含的信息主要如下:
2)除了以上字段和信息之外,还可以通过如下的组合参数来查看包中的具体数据:
和上面的比起来多了一个data字段,具体如下 [PACKET] codec_type=video stream_index=0 pts=379904 pts_time=24.733333 dts=379904 dts_time=24.733333 ration=512 ration_time=0.033333 size=2010 pos=3272564 flags=__ data= 00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 ….A..!?.X..1.. 00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f …A..'…Qu…O 00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 ….2$…..~.0..
略过一大段数据 00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ….Z.O.aLV….. 00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 .Y.G.m.K….y..I 00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 *..”….1…w%.' 000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 ..pQ.{.Id.?.j=9. 000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 …..”.w+25…S. 000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 …r.P.A.tP1…. 000007d0: f1b9 77a7 ad54 0800 010f ..w..T…. [/PACKET] 从输出的内容中可以看到多媒体包中包含的数据,那么我们可以根据上述输出内容中的pos,也就是文件偏移位置来查看,pos的值为3272564,将其转换为十六进制位置为0x31EF74,这就是这个包在flv文件中的偏移量,可以使用Linux下的xxd 1.mp4命令进行查看: 0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 ……..A..!?.X. 0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 .1…..A..'…Qu 0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e 0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 .0..8…….6,.. 0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 . .2..gs.^x….. 0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f …-….”3.?=B.. 可以看到从0x31EF74开始的数据和上面一致:0000 07d6 419a cc21 3ffa 5800。 通过ffprobe读取packets来进行对应的数据分析,使用show_packets与show_data配合可以进行更加精确的分析。 3)除了packets与data之外,ffprobe还可以分析多媒体的封装格式,其使用FORMAT标签括起来显示:
[FORMAT] filename=1.mp4 nb_streams=2 nb_programs=0 format_name=mov,mp4,m4a,3gp,3g2,mj2 format_long_name=QuickTime / MOV start_time=0.000000 ration=25.704000 size=3307949 bit_rate=1029551 probe_score=100 TAG:major_brand=isom TAG:minor_version=512 TAG:compatible_brands=isomiso2avc1mp41 TAG:encoder=Lavf55.33.100 [/FORMAT] 下面是对输出信息关键字段的说明:
4)使用下面的命令可以查看视频文件的帧信息,输出的帧信息将使用FRAME标签括起来:
[FRAME] media_type=video stream_index=0 key_frame=1 pts=0 pts_time=0.000000 pkt_dts=0 pkt_dts_time=0.000000 best_effort_timestamp=0 best_effort_timestamp_time=0.000000 pkt_ration=512 pkt_ration_time=0.033333 pkt_pos=22995 pkt_size=1888 width=720 height=1280 pix_fmt=yuv420p sample_aspect_ratio=N/A pict_type=I coded_picture_number=0 display_picture_number=0 interlaced_frame=0 top_field_first=0 repeat_pict=0 color_range=tv color_space=bt709 color_primaries=bt709 color_transfer=bt709 chroma_location=left [/FRAME] 通过-show-frames参数可以查看每一帧的信息,下面就来介绍一下其中重要的信息,
在Windows下常用的Elecard StreamEye工具中打开查看MP4时,会很直观地看到帧类型显示,用ffprobe的pict_type同样可以看到视频的帧是I帧,P帧或者B帧;每一帧的大小同样也可以通过ffprobe的pkt_size查看到。 5)通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM标签括起来:
[STREAM] index=0 codec_name=h264 codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 profile=Main codec_type=video codec_tag_string=avc1 codec_tag=0x31637661 width=720 height=1280 coded_width=720 coded_height=1280 closed_captions=0 film_grain=0 has_b_frames=0 sample_aspect_ratio=N/A display_aspect_ratio=N/A pix_fmt=yuv420p level=42 color_range=tv color_space=bt709 color_transfer=bt709 color_primaries=bt709 chroma_location=left field_order=progressive refs=1 is_avc=true nal_length_size=4 id=0x1 r_frame_rate=30/1 avg_frame_rate=30/1 time_base=1/15360 start_pts=0 start_time=0.000000 ration_ts=388608 ration=25.300000 bit_rate=964695 max_bit_rate=N/A bits_per_raw_sample=8 nb_frames=759 nb_read_frames=N/A nb_read_packets=N/A extradata_size=39 DISPOSITION:default=1 DISPOSITION:b=0 DISPOSITION:original=0 DISPOSITION:comment=0 DISPOSITION:lyrics=0 DISPOSITION:karaoke=0 DISPOSITION:forced=0 DISPOSITION:hearing_impaired=0 DISPOSITION:visual_impaired=0 DISPOSITION:clean_effects=0 DISPOSITION:attached_pic=0 DISPOSITION:timed_thumbnails=0 DISPOSITION:captions=0 DISPOSITION:descriptions=0 DISPOSITION:metadata=0 DISPOSITION:dependent=0 DISPOSITION:still_image=0 TAG:language=und TAG:handler_name=VideoHandler TAG:vendor_id=[0][0][0][0] [/STREAM] 如以上输出内容所示,从中可以看到流的信息,具体属性及说明如下表
fprobe 使用前面的参数可以获得key-value格式的显示方式,但是阅读起来因为习惯不同,可能有的人会认为方便,有的人认为不方便;如果要进行格式化的显示,这样就需要用到ffprobe -print_format 或者 ffprobe -of 参数来进行相应的格式输出,而-print_format 支持多种格式输出,包括XML,INI,JSON,CSV,FLAT等。下面列举几种常见的格式输出的例子
<?xml version=”1.0″ encoding=”UTF-8″?> <ffprobe> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from Ƈ.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf55.33.100 Duration: 00:00:25.70, start: 0.000000, bitrate: 1029 kb/s Stream #0:0 0x1 : Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720×1280, 964 kb/s, 30 fps, 30 tbr, 15360 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1 0x2 : Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 72 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] <streams> <stream index=”0″ codec_name=”h264″ codec_long_name=”H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10″ profile=”Main” codec_type=”video” codec_tag_string=”avc1″ codec_tag=”0x31637661″ width=”720″ height=”1280″ coded_width=”720″ coded_height=”1280″ closed_captions=”0″ film_grain=”0″ has_b_frames=”0″ pix_fmt=”yuv420p” level=”42″ color_range=”tv” color_space=”bt709″ color_transfer=”bt709″ color_primaries=”bt709″ chroma_location=”left” field_order=”progressive” refs=”1″ is_avc=”true” nal_length_size=”4″ id=”0x1″ r_frame_rate=”30/1″ avg_frame_rate=”30/1″ time_base=”1/15360″ start_pts=”0″ start_time=”0.000000″ ration_ts=”388608″ ration=”25.300000″ bit_rate=”964695″ bits_per_raw_sample=”8″ nb_frames=”759″ extradata_size=”39″> <disposition default=”1″ b=”0″ original=”0″ comment=”0″ lyrics=”0″ karaoke=”0″ forced=”0″ hearing_impaired=”0″ visual_impaired=”0″ clean_effects=”0″ attached_pic=”0″ timed_thumbnails=”0″ captions=”0″ descriptions=”0″ metadata=”0″ dependent=”0″ still_image=”0″/> <tag key=”language” value=”und”/> <tag key=”handler_name” value=”VideoHandler”/> <tag key=”vendor_id” value=”[0][0][0][0]”/> </stream> <stream index=”1″ codec_name=”aac” codec_long_name=”AAC (Advanced Audio Coding)” profile=”LC” codec_type=”audio” codec_tag_string=”mp4a” codec_tag=”0x6134706d” sample_fmt=”fltp” sample_rate=”44100″ channels=”2″ channel_layout=”stereo” bits_per_sample=”0″ id=”0x2″ r_frame_rate=”0/0″ avg_frame_rate=”0/0″ time_base=”1/44100″ start_pts=”0″ start_time=”0.000000″ ration_ts=”1133511″ ration=”25.703197″ bit_rate=”72863″ nb_frames=”1107″ extradata_size=”2″> <disposition default=”1″ b=”0″ original=”0″ comment=”0″ lyrics=”0″ karaoke=”0″ forced=”0″ hearing_impaired=”0″ visual_impaired=”0″ clean_effects=”0″ attached_pic=”0″ timed_thumbnails=”0″ captions=”0″ descriptions=”0″ metadata=”0″ dependent=”0″ still_image=”0″/> <tag key=”language” value=”und”/> <tag key=”handler_name” value=”SoundHandler”/> <tag key=”vendor_id” value=”[0][0][0][0]”/> </stream> </streams> </ffprobe> 从输出的内容可以看到,输出的内容格式为XML格式,如果原有的业务本身就可以解析XML格式,那么就不需要更改解析引擎,直接将输出内容输出为XML格式即可,解析引擎解析Packet信息是会更方便。 输出INI格式:
输出FLAT格式:
输出JSON格式:
输出CSV格式:
通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。 CSV格式输出后可以使用Excel打开表格形式
可以在命令行中自行输出,输出的frame信息全部为视频相关的信息。 使用ffprobe还可以查看很多信息,我们可以通过本节介绍的help方法查看更多更详细的信息
在FFmpeg中通常使用ffplay作为播放器,其实ffplay同样也可作为很多音视频的图形化分析工具,通过ffplay可以看到视频图像的运动估计方向、音频数据的波形等,以下将介绍更多参数并举例说明。 1)ffplay常用参数 ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎、format引擎,以及filter引擎的工具,并且还可以进行可视化的媒体参数分析。其可以通过ffplay –help进行查看:
Simple media player usage: ffplay [options] input_file
Main options: -L show license -h topic show help -? topic show help -help topic show help –help topic show help -version show version -buildconf show build configuration -formats show available formats -muxers show available muxers -demuxers show available demuxers -devices show available devices -codecs show available codecs -decoders show available decoders -encoders show available encoders -bsfs show available bit stream filters -protocols show available protocols -filters show available filters -pix_fmts show available pixel formats -layouts show standard channel layouts -sample_fmts show available audio sample formats -dispositions show available stream dispositions -colors show available color names -loglevel loglevel set logging level -v loglevel set logging level -report generate a report -max_alloc bytes set maximum size of a single allocated block -sources device list sources of the input device -sinks device list sinks of the output device -x width force displayed width -y height force displayed height -s size set frame size (WxH or abbreviation) -fs force full screen -an disable audio -vn disable video -sn disable subtitling -ss pos seek to a given position in seconds -t ration play “ration” seconds of audio/video -bytes val seek by bytes 0=off 1=on -1=auto -seek_interval seconds set seek interval for left/right keys, in seconds -nodisp disable graphical display -noborder borderless window -alwaysontop window always on top -volume volume set startup volume 0=min 100=max -f fmt force format -window_title window title set window title -af filter_graph set audio filters -showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT) -i input_file read specified file -codec decoder_name force decoder -autorotate automatically rotate video 这只是Main options里面的部分,另外还有Advanced options,AVCodecContext AVOptions等等很多内容。就上述帮助信息的输出所示,有些是前面已经介绍过的参数,这里就不再一一赘述,一些未介绍的参数说明见下表
常见参数可以手动进行尝试,下面列举几个示例。 *如果希望从视频的第5秒开始播放,播放5秒钟的文件,则可以使用如下命令
*如果希望视频播放时播放器的窗口显示标题为自定义标题,则可以使用如下命令
*如果希望使用ffplay打开网络直播流,则可以使用如下命令:
可以看出ffplay可以支持的协议有多种,ramp,rtmp,http等等都支持。 显示如下窗口内容
下面将这些参数与前面介绍过的一些参数进行组合,举几个例子。 1⃣️从10秒播放一个视频,播放时长为5秒,播放完毕后自动退出ffplay,播放器的窗口标题为“Hello World”,为了确认播放时长正确,可以通过系统命令time查看命令运行时长:
可以看到输出结果如下: ffplay -window_title “Hello World” -ss 10 -t 5 -autoexit 1.mp4 0.94s user 0.52s system 22% cpu 6.502 total 2⃣️如果强制使用H.264解码器解码MPEG4的视频,将会报错
我们这个视频是h264编码,所以可以正常播放。 查看视频编码可以使用
查看ffmpeg支持的解码格式
下面这个方式解码就会报错
前面举过的例子中,我们看到的比较多的是单节目的流,多节目的流,常用于广电行业的视频。当视频中出现多个Program时,播放Program与常规的播放方式有所不同,需要指定对应的流,可以通过vst,ast,sst参数来指定,例如希望播放Program 13中的音视频流,视频编号为4,音频编号为5,则可以通过如下命令进行制定:
有条件的朋友可以自己找视频来查看。 3⃣️如果使用ffplay播放视频时希望加载字幕文件,则可以通过加载ASS或者SRT字幕文件来解决,下面列举一个加载SRT字幕的例子,首先编辑SRT字幕文件,内容如下: 1 00:00:01.000 –> 00:00:05.000 这是我 我是谁 2 00:00:05.001 –> 00:00:10.000 我爱中国 3 00:00:10.001 –> 00:00:15.000 为人民服务 4 00:00:18.001 –> 00:00:20.000 疫情早日结束,国泰民安!
然后通过filter将字幕文件加载到播放数据中,使用命令如下:
播放的效果如下:
可以看出,视频中已经将SRT格式的文字字幕加入到视频中并展现了出来。 2)ffplay的数据可视化分析应用 使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如播放音频文件时,如果不确定文件的声音是否正常,则可以直接使用ffplay播放音频文件,播放的时候其将会把解码后的音频数据以音频波形的形式显示出来,
命令行执行后的效果如下:
从图中可以看到,音频播放时的波形可以通过振幅显示出来,可以用来查看音频的播放情况。 当播放视频时想要体验解码器是如何解码每个宏块的,可以使用如下命令
新版FFmpeg此方法已经不再支持啦,可参考 https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors 我们可以使用ffmpeg或者ffplay来分析视频文件中的运动向量。ffmpeg的早期版本(2017年10月之前)也允许分析宏块,但此选项已被删除。 'codecview'过滤器可用于将运动向量显示为每个宏块的小箭头。它采用一个叫mv的选项,它指定了要绘制的运动向量的类型:
你可以使用如下的命令
第一条命令是直接用ffplay显示视频。 第二条命令是把生成的带有运动向量的视频保存到output.mp4中。 显示效果如下: