FFmpeg简介


模块库

  • avcodec

    用于音视频编解码,支持自带的MPEG4,AAC,MJPEG等编码格式,还支持第三方的编解码,比如H.264(AVC,使用X264编解码器),H.265(HEVC,使用X265编解码器)

  • avdevice

    多媒体设备输入输出

  • avfilter

    滤镜特效

  • avformat

    封装格式处理,包括封装/解封装,如MP4,FLV,TS等文件封装格式,RTMP,RTSP,HLS等网络协议封装格式,FFmpeg是否支持某种具体的格式,取决于编译时是否包含了该格式的封装库,当然你也可以定制封装格式并添加对应的支持.

  • avutil

    工具库

  • swresample

    音频转换计算模块,提供了高级别的音频重采样API

  • swscale

    视频图像转换计算模块,提供了高级别的图像转换API,运行进行图像缩放和像素格式转换,比如将图像从1080p转换成720p,将图像数据从YUV转成RGB.

ffmpeg

ffmpeg -i input.mp4 output.avi

这个命令会将input.mp4转换成avi格式;

当然也可以显示指定格式:

ffmpeg -i input.mp4 -f avi output.avi

效果是一样的.

这个命令会执行以下几个步骤:

  1. 解封装(Demux)
  2. 解码(Decode)
  3. 编码(Encode)
  4. 封装(Mux)

ffplay

用于测试音视频播放的程序,依赖于SDL.

比如播放一个测试视频:

ffplay input.mp4

ffprobe

一个强大的多媒体分析工具.利用ffprobe可以从音视频文件或者流中获取一些信息,比如音视频参数,容器的参数,音频的格式,视频的格式,视频的总时长,码率等.

比如:

ffprobe -show_streams bee.mp4

会输出如下信息:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bee.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    creation_time   : 2015-08-10T09:55:17.000000Z
  Duration: 00:00:04.04, start: 0.000000, bitrate: 2562 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 2407 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2015-08-10T09:55:17.000000Z
      handler_name    : L-SMASH Video Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 147 kb/s (default)
    Metadata:
      creation_time   : 2015-08-10T09:55:17.000000Z
      handler_name    : L-SMASH Audio Handler
jiangkang@jkmac videos % ffprobe -show_streams bee.mp4
ffprobe version 4.3 Copyright (c) 2007-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3_1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bee.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    creation_time   : 2015-08-10T09:55:17.000000Z
  Duration: 00:00:04.04, start: 0.000000, bitrate: 2562 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 2407 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2015-08-10T09:55:17.000000Z
      handler_name    : L-SMASH Video Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 147 kb/s (default)
    Metadata:
      creation_time   : 2015-08-10T09:55:17.000000Z
      handler_name    : L-SMASH Audio Handler
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=1001/60000
codec_tag_string=avc1
codec_tag=0x31637661
width=1280
height=720
coded_width=1280
coded_height=720
closed_captions=0
has_b_frames=2
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=31
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=30000/1001
avg_frame_rate=30000/1001
time_base=1/30000
start_pts=0
start_time=0.000000
duration_ts=121100
duration=4.036667
bit_rate=2407163
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=121
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=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
TAG:creation_time=2015-08-10T09:55:17.000000Z
TAG:language=und
TAG:handler_name=L-SMASH Video Handler
TAG:encoder=AVC Coding
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/48000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=193520
duration=4.031667
bit_rate=147714
max_bit_rate=153472
bits_per_raw_sample=N/A
nb_frames=189
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=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
TAG:creation_time=2015-08-10T09:55:17.000000Z
TAG:language=und
TAG:handler_name=L-SMASH Audio Handler
[/STREAM]

文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
TLS-Pinning TLS-Pinning
什么是SSL/TLS Pinning?将服务端提供的TLS/SSL证书内置到移动端开发的APP客户端中,当客户端发起请求时,通过比对内置证书和服务器端证书的内容,以确定这个连接的合法性. 我这里把Pinning翻译成“固定” Pinni
2020-06-21
下一篇 
Flutter-自定义闪屏页(SplashScreen) Flutter-自定义闪屏页(SplashScreen)
Splash Screen?对于Android应用来说,Splash Screen最熟悉不过了.比如为了让启动的时候app不现实白屏,或者为了弄个开屏广告用来盈利,都会用到Splash Screen. Flutter中如何自定义Splas
2020-06-19
  目录