ffmpeg的正确打开方式(三剑客之一)

2021-06-29 15:50:27 浏览数 (1)

目录

前言

实战

一、编码器

二、解码器

三、滤镜

四、封装格式

五、常用命令

5.1 抽取纯音频文件

5.2 抽取纯视频文件

5.3 合并音频和视频文件

结尾


前言

FFmpeg是一个完整的跨平台音视频解决方案,它可以用于处理音频和视频的转码、录制、流化处理等应用场景。官网:http://ffmpeg.org/。FFmpeg有三大利器,分别是ffmpeg、ffprobe、ffplay。今天主要介绍ffmpeg,它是FFmpeg用于音视频转码,转封装、转推流的基础工具。


实战

一、编码器

使用 ffmpeg -encoders 命令可以查看当前ffmpeg版本支持的编码器都有哪些。如果你正在使用ffmpeg编码,报错了,你可以使用这个命令查看一下当前的编码器是否支持。这里你可能会问,ffmpeg没有统一的版本吗?为什么支持的编码器还不一样?官网正式的ffmpeg版本肯定是统一的,但是实际项目我们不可能使用所有的编码器、解码器、滤镜等组件,一般会进行裁剪,因此你正在使用的版本可能就缺少某些编码器或者解码器,这样解释应该可以理解吧。

执行 ffmpeg -encoders 命令的结果如下所示:

ffmpeg version 3.0.7 Copyright (c) 2000-2017 the FFmpeg developers built with Apple LLVM version 9.1.0 (clang-902.0.39.1) configuration: libavutil 55. 17.103 / 55. 17.103 libavcodec 57. 24.102 / 57. 24.102 libavformat 57. 25.100 / 57. 25.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 31.100 / 6. 31.100 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 Encoders: V..... = Video A..... = Audio S..... = Subtitle .F.... = Frame-level multithreading ..S... = Slice-level multithreading ...X.. = Codec is experimental ....B. = Supports draw_horiz_band .....D = Supports direct rendering method 1 ------ V..... a64multi Multicolor charset for Commodore 64 (codec a64_multi) V..... a64multi5 Multicolor charset for Commodore 64, extended with 5th color (colram) (codec a64_multi5) V..... alias_pix Alias/Wavefront PIX image V..... amv AMV Video V..... apng APNG (Animated Portable Network Graphics) image V..... asv1 ASUS V1 。。。。。。

从中可以看出ffmpeg支持的视频编码器中,常见的有flv,h263,mpeg等;音频编码器有pcm,ac3,aac,g722等。


二、解码器

使用 ffmpeg -decoders 命令可以查看当前ffmpeg版本支持的解码器都有哪些。命令最开始会显示当前ffmpeg版本已经不同组建的版本,其实ffmpeg本身就是一个工具集合,内部包含了不同的功能模块。其中包括libavutil,libavcodec,libavformat,libavdevice,libavfilter,libswscale,libswresample七部分。

执行命令后的结果如下所示:

Decoders: V..... = Video A..... = Audio S..... = Subtitle .F.... = Frame-level multithreading ..S... = Slice-level multithreading ...X.. = Codec is experimental ....B. = Supports draw_horiz_band .....D = Supports direct rendering method 1 ------ V....D 012v Uncompressed 4:2:2 10-bit V.S..D prores ProRes V.S..D prores_lgpl Apple ProRes (iCodec Pro) (codec prores) V....D ptx V.Flash PTX image V....D qdraw Apple QuickDraw A..... dsd_msbf DSD (Direct Stream Digital), most significant bit first A..... dsd_msbf_planar DSD (Direct Stream Digital), most significant bit first, planar A....D dsicinaudio Delphine Software International CIN audio S..... microdvd MicroDVD subtitle S..... mov_text 3GPP Timed Text subtitle S..... mpl2 MPL2 subtitle 。。。。。。

从中可以看出ffmpeg支持的视频解码器中,常见的有flv,h263,h264,mpeg,vp8,vp9等;音频编码器有pcm,ac3,aac,g722,opus等。是不是感觉ffmpeg支持的解码器要比编码器多?是的,你的感觉没有错。ffmpeg本身更多的用于解码,编码器更多的是先由一些视频厂家或者第三方结构定义出来的不同视频编码标准,然后ffmpeg根据需要是否决定支持对应的解码功能,比如编码h264视频时,更多使用的是openH264或者是x264编码库。

另外需要说明的是,有一个类似等式:ffmpeg -codecs = (ffmpeg -encoders) (ffmpeg -decoders) 。意思就是你也可以使用ffmpeg -codecs 命令查看总的编码器和解码器的情况。


三、滤镜

使用 ffmpeg -filters 命令可以查看当前ffmpeg版本都支持哪些滤镜。

执行命令后的结果如下所示:

Filters: T.. = Timeline support .S. = Slice threading ..C = Command support A = Audio input/output V = Video input/output N = Dynamic number and/or type of input/output | = Source or sink filter ... acompressor A->A Audio compressor. ... acrossfade AA->A Cross fade two input audio streams. TS. atadenoise V->V Apply an Adaptive Temporal Averaging Denoiser. T.. bbox V->V Compute bounding box for each frame. T.. drawbox V->V Draw a colored box on the input video. ... drawgraph V->V Draw a graph using input video metadata. T.. drawgrid V->V Draw a colored grid on the input video. T.. edgedetect V->V Detect and draw edge. ... elbg V->V Apply posterize effect, using the ELBG algorithm. ... noformat V->V Force libavfilter not to use any of the specified pixel formats for the input to the next filter. ... trim V->V Pick one continuous section from the input, drop the rest. T.. unsharp V->V Sharpen or blur the input video. ... vectorscope V->V Video vectorscope. ... vflip V->V Flip the input video vertically. T.. vignette V->V Make or reverse a vignette effect. ... vstack N->V Stack video inputs vertically. TS. w3fdif V->V Apply Martin Weston three field deinterlace. ... waveform V->V Video waveform monitor. .S. xbr V->V Scale the input using xBR algorithm. TS. yadif V->V Deinterlace the input image. 。。。。。。

过滤器中的类型有时间线支持、线程切片、命令行支持、控制音频输入输出、控制视频输入输出、动态控制输入输出的数量和类型、源滤波器。


四、封装格式

说到封装格式,大家就比较容易理解了,就是我们平时看到的视频文件的后缀,比如mp4,flv,mkv,webm,ts,3gp等等。ffmpeg在编码的时候需要用到支持的封装格式,比如把aac的音频和h264的视频封装成mp4文件;解码的时候需要用到支持的解封装格式,比如把mp4文件解封装成aac的音频和h264的视频。使用 ffmpeg -formats 命令可以查看支持的所有封装格式和解封装格式。

执行命令的结果如下所示:

File formats: D. = Demuxing supported .E = Muxing supported -- D 3dostr 3DO STR E 3g2 3GP2 (3GPP2 file format) E 3gp 3GP (3GPP file format) DE aiff Audio IFF D boa Black Ops Audio D brender_pix BRender PIX image D brstm BRSTM (Binary Revolution Stream) D c93 Interplay C93 DE caf Apple CAF (Core Audio Format) E dash DASH Muxer DE data raw data DE dv DV (Digital Video) D dvbsub raw dvbsub E dvd MPEG-2 PS (DVD VOB) D dxa DXA DE filmstrip Adobe Filmstrip DE flac raw FLAC D flic FLI/FLC/FLX animation 。。。。。。


五、常用命令

5.1 抽取纯音频文件

这个例子我们演示从视频文件(recorder001.mp4)中抽取出纯音频文件(recorder001.aac),命令:ffmpeg -i recorder001.mp4 -vn -acodec copy recorder001.aac 。注意:recorder001.aac文件是可以直接播放的。

执行过程:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'recorder001.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.42.100 Duration: 00:00:08.97, start: 0.000000, bitrate: 1243 kb/s Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1119 kb/s, 23.87 fps, 16k tbr, 16k tbn, 32k tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 130 kb/s (default) Metadata: handler_name : SoundHandler Output #0, adts, to 'recorder001.aac': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf57.25.100 Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, 130 kb/s (default) Metadata: handler_name : SoundHandler Stream mapping: Stream #0:1 -> #0:0 (copy) Press [q] to stop, [?] for help [adts @ 0x7f8d46800600] Packet with invalid duration -47820 in stream 0 size= 128kB time=00:00:08.98 bitrate= 116.7kbits/s speed=2.52e 03x video:0kB audio:126kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.848199%

-vn:表示不要视频内容;

-acodec copy:表示完全拷贝音频信息。


5.2 抽取纯视频文件

这个例子我们演示从视频文件(recorder001.mp4)中抽取出纯视频文件(recorder001.h264),命令:ffmpeg -i recorder001.mp4 -an -vcodec copy recorder001.h264 。注意:recorder001.h264文件是不能直接播放的,需要特定的h264裸流播放器。

执行过程:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'recorder001.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.42.100 Duration: 00:00:08.97, start: 0.000000, bitrate: 1243 kb/s Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1119 kb/s, 23.87 fps, 16k tbr, 16k tbn, 32k tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 130 kb/s (default) Metadata: handler_name : SoundHandler Output #0, h264, to 'recorder001.h264': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf57.25.100 Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1119 kb/s, 23.87 fps, 16k tbr, 16k tbn, 16k tbc (default) Metadata: handler_name : VideoHandler Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help frame= 214 fps=0.0 q=-1.0 Lsize= 1225kB time=00:00:08.96 bitrate=1119.1kbits/s speed= 265x video:1225kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%


5.3 合并音频和视频文件

这个例子我们演示把一个视频文件和一个音频文件合并成一个音视频文件,命令:ffmpeg -i 少年.mp3 -i benben.mp4 -acodec copy -vcodec copy recorder003.mp4 。生成的文件在播放过程中就包含了音频文件输入的声音。

执行命令的结果如下所示:

[mp3 @ 0x7ffabc003000] Skipping 0 bytes of junk at 417. Input #0, mp3, from '少年.mp3': Duration: 00:03:56.15, start: 0.025057, bitrate: 128 kb/s Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s Metadata: encoder : LAME3.99r Side data: replaygain: track gain - -8.000000, track peak - unknown, album gain - unknown, album peak - unknown, Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'benben.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2018-02-03 03:10:11 location : 40.0679 116.2994/ location-eng : 40.0679 116.2994/ com.android.version: 7.0 Duration: 00:00:10.06, start: 0.000000, bitrate: 17642 kb/s Stream #1:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 17084 kb/s, SAR 1:1 DAR 16:9, 30.04 fps, 30 tbr, 90k tbn, 60 tbc (default) Metadata: rotate : 90 creation_time : 2018-02-03 03:10:11 handler_name : VideoHandle Side data: displaymatrix: rotation of -90.00 degrees Stream #1:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 192 kb/s (default) Metadata: creation_time : 2018-02-03 03:10:11 handler_name : SoundHandle File 'recorder003.mp4' already exists. Overwrite ? [y/N] y Output #0, mp4, to 'recorder003.mp4': Metadata: encoder : Lavf57.25.100 Stream #0:0(eng): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 17084 kb/s, 30.04 fps, 30 tbr, 90k tbn, 90k tbc (default) Metadata: rotate : 90 creation_time : 2018-02-03 03:10:11 handler_name : VideoHandle Side data: displaymatrix: rotation of -90.00 degrees Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 44100 Hz, stereo, 128 kb/s Metadata: encoder : LAME3.99r Side data: replaygain: track gain - -8.000000, track peak - unknown, album gain - unknown, album peak - unknown, Stream mapping: Stream #1:0 -> #0:0 (copy) Stream #0:0 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 303 fps=0.0 q=-1.0 Lsize= 24770kB time=00:03:56.12 bitrate= 859.4kbits/s speed= 860x video:21035kB audio:3690kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.179204%


结尾

ffmpeg还有很多其他的用法,这里就不一一说明了,感兴趣的小伙伴,自己动手试试吧。

0 人点赞