FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具

(本文基本逻辑:ffmpeg 常用命令介绍 → ffplay 常用命令介绍 → ffprobe 常用命令介绍)

从事音视频开发的程序员几乎都应该知道或使用过 FFmpeg。FFmpeg 是一个开源软件,采用 LGPL 或 GPL 许可证(需要注意这里的开源协议,它具有『传染性』,会要求它的使用方也开源)。我们可以使用 FFmpeg 来进行多种格式音频和视频的录制、转换、流处理功能。

FFmpeg 由多个组件组成,包含了命令行应用程序以及一系列函数库:

  • 命令行应用程序:

  • ffmpeg:用于音视频的编解码、格式转换以及音视频流的内容处理。

  • ffplay:基于 SDL 与 ffmpeg 库实现的一个播放器。

  • ffprobe:音视频分析工具。

  • 函数库:

  • libavcodec:编解码库。

  • libavformat:音视频容器格式以及所支持的协议的封装和解析。

  • libavutil:提供了一些公共函数,工具库。

  • libavfilter:音视频的滤镜库,如视频加水印、音频变声等。

  • libavdevice:支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制。

  • libswresample, libavresample:提供音频的重采样工具库。

  • libswscale:提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的 YUV 转换。

  • libpostproc:多媒体后处理器。

如果你使用 Mac 设备,在 Mac 上安装 FFmpeg 可以用 Homebrew

$ brew install ffmpeg

至于 Homebrew 的安装,以及使用它安装 ffmpeg 的相关细节,这里就不做过多探讨了。

本文主要介绍 FFmpeg 命令行应用程序的使用,这是我们在音视频开发中必不可少的工具。

1、ffmpeg 命令行工具

ffmpeg 是一个音视频编解码、格式转换以及音视频流内容处理的工具。

1.1、基础能力

通过下列命令可以查看当前 ffmpeg 工具所支持的能力:

// 获取帮助$ ffmpeg -help// 支持的格式$ ffmpeg -formats// 支持的解码$ ffmpeg -decoders// 支持的编码$ ffmpeg -encoders// 支持的协议$ ffmpeg -protocols

1.2、转封装

可以使用下列命令来转封装:

$ ffmpeg -i <输入文件路径> -c copy -f <输出封装格式> <输入文件路径>

1)转 MP4

MP4 是当下短视频最常使用的封装格式。

FFmpeg 封装 MP4 常用参数:

FFmpeg 封装 MP4 常用参数

示例:将 FLV 的文件转封装成 MP4 并将 moov box 移动到文件头部。

$ ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~
  

2)转 FLV

FLV 是当下实时直播最常使用的封装格式。

FFmpeg 封装 FLV 常用参数:

FFmpeg 封装 FLV 常用参数

示例:将 MP4 的文件转封装成 FLV。

$ ffmpeg -i input.mp4 -c copy -f flv output.flv

FLV 封装中可以支持的音频编码和视频编码是有限的,在转封装的时候,如果音频或视频不符合标准时,会封装不了而报错。一般,我们可以在转封装的时候同时将音频和视频转码成 FLV 支持的格式。

示例:将 MP4 的文件转封装成 FLV 并确保音频转码为 AAC。

$ ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv

3)转 HLS

HLS 是当下直播回放和部分实时直播场景最常使用的协议,它对应的媒体格式是 M3U8 + TS。

FFmpeg 封装 HLS 常用参数:

FFmpeg 封装 HLS 常用参数

示例:将 MP4 的文件转封装成 HLS 直播。

$ ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8

因为默认是 HLS 直播,所以生成的 M3U8 文件内容会随着切片的产生而更新。这里多了一个 -bsf:v h264_mp4toannexb 参数,它的作用是将 MP4 中的 H.264 数据转换为 H.264 AnnexB 标准的编码,AnnexB 标准的编码常见于实时传输流中。如果源文件为 FLV、TS 等可作为直播传输流的视频,则不需要这个参数。

  • re:表示以本地帧率读数据。

  • bsf:表示 Binary Stream Filter。

4)音视频流抽取

FFmpeg 除了转封装、转码之外,还可以提取音频流和视频流。

示例:从 MP4 文件中提取 AAC 音频流。

$ ffmpeg -i input.mp4 -vn -acodec copy output.aac
  • vn:表示不包含视频。

示例:从 MP4 文件中提取 H.264 视频流。

$ ffmpeg -i input.mp4 -an -vcodec copy output.h264
  • an:表示不包含音频。

示例:从 MP4 文件中提取 H.265 视频流。

$ ffmpeg -i input.mp4 -an -vcodec copy -bsf hevc_mp4toannexb -f hevc output.hevc

1.3、转码

FFmpeg 一般使用 libx264 来进行软编码。下面是 x264 相关的编码参数:

FFmpeg x264编码常用参数

1)Preset

示例:设置 preset 预设参数为 ultrafast 进行转码。

$ ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
  • b:v:表示视频输出码率。

2)Profile

示例:设置 profile 为 high 进行转码。

$ ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 720x1280 -an -y -t 10 output_high.ts
  • y:表示覆盖输出文件。

  • s:表示输出分辨率。

使用 main profile 和 high profile 编码出来的视频是可以包含 B 帧的,转码完后,可以看一下:

$ ffprobe -v quiet -show_frames -select_streams v output_high.ts | grep "pict_type=B" | wc -l

3)GOP

示例:设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值