当前位置 : 首页 » 文章分类 :  开发  »  FFmpeg

FFmpeg

FFmpeg 使用笔记
https://www.ffmpeg.org/


Intel/M1 Mac Brew 安装 FFmpeg

brew install ffmpeg 安装 FFmpeg
Intel Mac 安装目录 /usr/local/Cellar/ffmpeg/4.4_2
M1 Mac 安装目录 /opt/homebrew/Cellar/ffmpeg/5.0.1_3


h.264 编码

支持 H.264 的封装格式有很多,如FLV ,MP4 , HLS(M3U8),MKV ,TS等格式
FFMpeg 本身并不支持 H.264 的编码器,而是由 FFMpeg 的第三方模块对其进行支持,例如 x264 和 OpenH264,二者各有各的优势。由于 OpenH264 开源比较晚,所以 x264 还是当前最常用的编码器,


视频编解码核心概念

I帧/B帧/P帧

I帧 是关键帧,属于帧内压缩,解码时单独的该帧便可得到完整画面。
I帧(intra picture)

P帧 为向前预测编码帧,即 P帧 解码时需要参考前面相关帧的信息才能解码。
P帧 前向预测编码帧(predictive-frame),只存储和前一帧(I帧或P帧)的差别,解码时需要叠加前一帧才能出完整画面。

B帧 为双向预测编码帧,解码时既需要参考前面已有的帧又需要参考后面待解码的帧;
B帧是 双向预测内插编码帧(bi-directional interpolated prediction frame),B帧记录本帧和前后帧的差别,解码时需要叠加前后帧才可得到完整画面。
B帧压缩率高,但编解码开销大。

B帧 和 P帧 都基于 I帧 来压缩数据。
I帧 和 P帧编解码简单,编解码时可线性前进。B帧编解码开销大,需要缓存前一帧和当前帧,拿到后一帧后才能完成编解码。

GOP

GOP(Group of picture) 图像组,指两个 I帧 之间形成一组图片。

DTS 和 PTS

视频解码中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,导致播放顺序与解码顺序不一致。

DTS(Decoding Time Stamp) 即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp) 即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

DTS 和 PTS 是编码时由编码器生成的。

编解码时,编解码器编码一个 I 帧,然后向后跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为B 帧。


ffmpeg

ffmpeg Documentation
https://ffmpeg.org/ffmpeg.html

语法 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

选项:
-hide_banner 全部 ffmpeg 命令默认都会打印版本、选项、库信息,命令中增加此选项可隐藏版本等信息。
-i url (input) 指定输入文件的 url,可以是媒体文件或视频流地址
-vcodec codec (output) 指定视频编解码器,等于 -codec:v

ffmpeg -i file/url 查看媒体文件/流基本信息

ffmpeg -i file/urlffprobe file/url 的结果完全相同,可用于查看媒体文件/流的基本信息

ffmpeg -i  drone01.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'drone01.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:05:09.72, start: 0.000000, bitrate: 3093 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 3090 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
At least one output file must be specified

ffmpeg -version 查看版本

ffmpeg version 5.0

# ffmpeg -version
ffmpeg version 5.0 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.30)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.0 --enable-shared --enable-pthreads --enable-version3 --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-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
libavutil      57. 17.100 / 57. 17.100
libavcodec     59. 18.100 / 59. 18.100
libavformat    59. 16.100 / 59. 16.100
libavdevice    59.  4.100 / 59.  4.100
libavfilter     8. 24.100 /  8. 24.100
libswscale      6.  4.100 /  6.  4.100
libswresample   4.  3.100 /  4.  3.100
libpostproc    56.  3.100 / 56.  3.100

ffmpeg version 4.4

# ffmpeg -version
ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --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-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
libavutil      56. 70.100 / 56. 70.100
libavcodec     58.134.100 / 58.134.100
libavformat    58. 76.100 / 58. 76.100
libavdevice    58. 13.100 / 58. 13.100
libavfilter     7.110.100 /  7.110.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  9.100 /  5.  9.100
libswresample   3.  9.100 /  3.  9.100
libpostproc    55.  9.100 / 55.  9.100

ffmpeg version 4.2

# ffmpeg -version
ffmpeg version 4.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)
configuration: --prefix=/usr/local/ffmpeg
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100

ffmpeg version 2.4.4

# ffmpeg -v
ffmpeg version 2.4.4 Copyright (c) 2000-2014 the FFmpeg developers
  built on Dec 20 2014 17:17:15 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --prefix=/home/langsim/work/ffmpegbuild-fdkaac/source/../dist --extra-ldflags=-L/home/langsim/work/ffmpegbuild-fdkaac/source/../dist/lib --extra-cflags=-I/home/langsim/work/ffmpegbuild-fdkaac/source/../dist/include --disable-debug --enable-static --enable-memalign-hack --enable-version3 --enable-gpl --enable-nonfree --enable-postproc --enable-libfaac --enable-libtheora --enable-libvorbis --enable-libmp3lame --enable-libx264 --enable-libfdk-aac --disable-doc --disable-bzlib --disable-zlib

-threads 指定线程数

默认线程数取决于 ffmpeg 版本、编解码格式、机器cpu核数

With libx264 it is cores x 1.5 for frame threads and cores x 1 for slice threads.


ffmpeg -codecs 查看支持的编解码格式

# ffmpeg -codecs 
ffmpeg version 4.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)
  configuration: --prefix=/usr/local/ffmpeg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
Codecs:
 D..... = Decoding supported
 .E.... = Encoding supported
 ..V... = Video codec
 ..A... = Audio codec
 ..S... = Subtitle codec
 ...I.. = Intra frame-only codec
 ....L. = Lossy compression
 .....S = Lossless compression
 ------
  D.V.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
  D.V.L. hevc                 H.265 / HEVC (High Efficiency Video Coding)
  D.A.L. mp3                  MP3 (MPEG audio layer 3) (decoders: mp3float mp3 ) 
  DEV.L. flv1                 FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (decoders: flv ) (encoders: flv )
  ...

ffmpeg 将单张图片转为一段视频

ffmpeg -loop 1 -i input.jpeg -r 24 -t 60 -vcodec libx264 -pix_fmt yuv420p out.mp4

ffmpeg -loop 1 -i input.jpg -c:v libx264 -t 120 -pix_fmt yuv420p output.flv

-loop 1 表示循环一次,即使用单张图片进行循环;
-i input.jpg 表示输入的图片名为 input.jpg;
-r 24 表示输出视频的帧率为每秒 24 帧;
-t 60 表示输出视频的时长为 60 秒
-vcodec libx264 表示使用 H.264 编码器进行编码;
-pix_fmt yuv420p 表示使用 yuv420p 色彩空间输出视频;
out.mp4 表示输出的视频文件名为 out.mp4。

ffmpeg 将一组图片转为一段视频

ffmpeg -r 30 -pattern_type glob -i ‘*.jpg’ -c:v libx264 -pix_fmt yuv420p output.mp4

-framerate 30/-r 30:指定帧率为30帧/秒。你可以根据需要调整该值。
-pattern_type glob -i ‘input/*.jpg’:使用通配符模式读取input文件夹中的所有.jpg格式的图片。
-c:v libx264:指定视频编码器为libx264。
-pix_fmt yuv420p:指定像素格式为yuv420p,这是常用的兼容性较好的像素格式。
output.mp4:输出的视频文件名为output.mp4。你可以根据需要更改此名称和路径。

ffmpeg 将rtmp视频流转存成一段视频文件

ffmpeg -i rtmp://127.0.0.1:8800/rtmp/xxxxx -c copy -t 00:01:00 rtmp2flv.flv

-i rtmp://输入流地址:指定输入流地址。这里需要替换为你要存储的RTMP视频流的实际地址。
-c copy:指定直接复制视频流而不进行重新编码。
-t 持续时间:要指定的时间范围,格式为HH:MM:SS(小时:分钟:秒)。例如,如果你想制定一个10分钟的视频,你可以将持续时间设置为00:10:00。
rtmp2flv.flv 输出文件名:指定输出的视频文件名。你可以根据需要更改此名称和路径。

ffmpeg 将单张图片转推为rtmp视频流

ffmpeg -loop 1 -i input.jpeg -vcodec libx264 -threads 4 -pix_fmt yuv420p -f flv rtmp://server:port/live/streamid

首先要有个流媒体服务器(srs 或 nginx-rtmp)
-f flv 表示输出格式为 FLV 格式,可以用于 RTMP 推送
-threads 4 线程
rtmp://server:port/live/streamid 是目标视频流地址,server:port 是流媒体服务器


ffmpeg avi视频文件 转 mp4

利用 -codec copy 参数保持视频和音频的编解码器不变,,直接将原始数据封装到mp4容器中。
ffmpeg -i input.avi -codec copy output.mp4

将 AVI 文件转换为 MP4 文件,同时保留原始的视频和音频编码
ffmpeg -i input.avi -c:v copy -c:a copy output.mp4

将 AVI 文件转换为 MP4 文件,-c:v libx264 指定使用 H.264 视频编码器,而 -c:a aac 指定使用 AAC 音频编码器
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

-vcodec libx264 指定输出视频的编码为H.264,-acodec aac 指定输出音频的编码为AAC
ffmpeg -i input.avi -vcodec libx264 -acodec aac output.mp4


ffmpeg ts视频文件 转 mp4

./ffmpeg -i input.ts -vcodec copy -an output.mp4


ffprobe

ffprobe Documentation
https://ffmpeg.org/ffprobe.html

语法 ffprobe [options] input_url

选项:
-hide_banner 全部 ffmpeg 命令默认都会打印版本、选项、库信息,命令中增加此选项可隐藏版本等信息。
-show_format 显示输入媒体的封装容器格式,封装格式信息都会位于 FORMAT 块中。

ffprobe file/url 查看媒体文件/流的基本信息

ffprobe file/url 可查看音视频文件/视频流的分辨率、码率、编码格式等信息

例1、查看视频文件的基本信息

ffprobe xx-video.mov
ffprobe version 5.0 Copyright (c) 2007-2022 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.30)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.0 --enable-shared --enable-pthreads --enable-version3 --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-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/masi/文件/00-产品模块/81-算子接入/算子接入演示录屏.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    creation_time   : 2021-12-29T07:34:58.000000Z
    com.apple.quicktime.make: Apple
    com.apple.quicktime.model: MacBookPro14,1
    com.apple.quicktime.software: Mac OS X 10.14.6 (18G103)
    com.apple.quicktime.creationdate: 2021-12-29T15:02:28+0800
  Duration: 00:31:00.98, start: 0.000000, bitrate: 3053 kb/s
  Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2721 kb/s, 59.54 fps, 60 tbr, 6k tbn (default)
    Metadata:
      creation_time   : 2021-12-29T07:34:58.000000Z
      handler_name    : Core Media Video
      vendor_id       : [0][0][0][0]
      encoder         : H.264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 324 kb/s (default)
    Metadata:
      creation_time   : 2021-12-29T07:34:58.000000Z
      handler_name    : Core Media Audio
      vendor_id       : [0][0][0][0]

例2、可正常打开的视频流能看到媒体信息

# ffprobe -hide_banner rtmp://127.0.0.1:8935/live/mytestvideo
Input #0, flv, from 'rtmp://127.0.0.1:8935/live/mytestvideo':
  Metadata:
    |RtmpSampleAccess: true
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.19.104
    server          : ILSC/1.0.0(CODE)
    srs_primary     : ILSC/1.0release
    srs_authors     : winlin,wenjie.zhao,hankun
    server_version  : 1.0.0
  Duration: N/A, start: 0.000000, bitrate: 2460 kb/s
  Stream #0:0: Data: none
  Stream #0:1: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2460 kb/s, 25 fps, 25 tbr, 1k tbn
Unsupported codec with id 0 for input stream 0

ffprobe 可用于测试视频流是否可打开

例3、ffprobe 可用于测试视频流是否可打开,正常打开可看到视频流的信息,打不开会报错,比如下面这个视频流就连不上

# ffprobe -hide_banner rtmp://127.0.0.1:1935/live/202112240548150001
[tcp @ 0x135804260] Connection to tcp://127.0.0.1:1935?tcp_nodelay=0 failed: Connection refused
[rtmp @ 0x1347043f0] Cannot open connection tcp://127.0.0.1:1935?tcp_nodelay=0
rtmp://127.0.0.1:1935/live/202112240548150001: Connection refused

VLC

CMD+N 打开网络视频流

填入 rtmp 地址后即可播放。

CMD+I 打开媒体信息

或者菜单栏 Window - Media Information -> Codec Details 编解码详细信息,能看编码格式、分辨率


上一篇 Java-基础

下一篇 VMware虚拟机

阅读
评论
3.2k
阅读预计15分钟
创建日期 2015-05-08
修改日期 2023-07-14
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论