音视频学习笔记二——FFmpeg简介

347 阅读8分钟

题记:这节开始学习FFmpeg的基础知识,可以大概看一下,为后面音视频做铺垫。

FFmpeg简介

FFmpeg 全称是“Fast Forward Moving Picture Expert Group”,是一个免费的音视频处理开源库。提供录制、转换以及流化音视频的完整解决方案,由命令行和函数库组成。它是由C语言编写有良好的跨平台性。

FFmpeg命令行示例

初学者体验一下FFmpeg命令行,FFmpeg安装比较简单,如在Mac平台下使用命令(首先安装好Homebrew)

brew install ffmpeg

命令行主要包括三个命令

  • ffmpeg 音视频编码器
    • 基本格式 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
      • [options] 全局参数 如线程数
      • [[infile options] -i infile] 输入选项 如文件格式,比特率
      • {[outfile options] outfile} 输出选项 如格式,分辨率
    • 参数示例
      • -a:n:去除音频流
      • -v:n:去除视频流
      • -af:音频过滤器,用于对音频进行滤波处理
      • -vf:视频过滤器,用于对视频进行滤波处理。后面可以接处理参数,如缩放、裁剪、旋转等
      • -c copy:直接复制,不经过重新编码(这样比较快
    • 示例
      • 格式转换 ffmpeg -i input.mp4 output.mkv
      • 裁剪ffmpeg -i input.mp4 -ss 00:00:10 -t 10 -c copy output.mp4
      • 缩放 ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4
  • ffplay 简单的播放器
    • ffplay [options] input_file
    • 参数示例
      • -x width:设置视频的显示宽度。
      • -y height:设置视频的显示高度。
      • -fs:全屏播放。
      • -an:不播放音频。
      • -vn:不显示视频。
      • -sn:不显示字幕。
  • ffprobe 多媒体流分析器
    • ffprobe [options] input_url
    • 参数示例
      • -show_format:显示多媒体文件的封装格式信息。
      • -show_streams:显示多媒体文件中的流信息,包括视频流、音频流、字幕流等。
      • -show_packets:显示多媒体文件中的数据包信息。
      • -show_frames:显示多媒体文件中的帧信息。
      • -show_entries <entry>:指定要显示的信息条目,可以是格式、流、数据包或帧的详细信息。
    • 示例
      • 显示视频文件的分辨率、帧率、码率等详细信息 ffprobe -v error -select_streams v:0 -show_entries stream=width,height,avg_frame_rate,r_frame_rate,bit_rate -of json video.mp4

FFmpeg函数库

ffmpeg类库.jpg

  • libavformat 专注于媒体容器格式的封装和解封装操作,支持从网络流、本地文件甚至内存缓冲区中读取数据。封装(Muxing)是将多个媒体数据流(如视频、音频、字幕等)组合并写入到指定的容器格式文件中,如MP4、MKV、FLV等。解封装(Demuxing)则是相反的过程,即将一个媒体文件分割为多个多媒体流。关键结构体:

    • AVFormatContext 存储关于输入输出文件的全部信息。如输入或输出(iformat或oformat)、基本流数组(streams)、I/O上下文(pb)。
    • AVInputFormatAVOutputFormat描述支持的输入输出容器格式。
    • AVPacket 数据包含已编码的帧数据;
    • AVStream 基本流,包含了与流相关的编解码器、数据段等信息
  • libavcodec 用于音视频各种格式的编解码,能够将音视频数据从一种格式解码为原始的音视频流,或者将原始的音视频流编码为指定格式。主要功能:

    • 音视频编解码 涵盖了几乎所有常见的音视频格式。例如,H.264、HEVC、MPEG-4、VP9 等视频编码器,以及 AAC、MP3、Opus 等音频编码器。
    • 硬件加速 支持硬件加速,利用 GPU、DSP 等硬件资源来加速音视频编解码。
    • 滤镜处理 可以对音视频数据进行处理操作,例如加噪声、去噪声、调整亮度、对比度等。
    • 伸缩和重采样 对音频数据进行伸缩和重采样的操作,以适应不同采样率、声道数等需求。
    • 字幕处理 支持对视频中的字幕进行解析
  • libavutil 包含一些公共的工具函数的使用库(C语言)。包括了

    • 数学函数 丰富的数学函数,包括对数计算、最大公约数计算、按比例转换数值等。
    • 内存管理 动态内存分配和释放的函数,如 av_mallocav_malloczav_free 等,以及从后向前拷贝内存的函数 av_memcpy_backptr
    • 数据结构 多种数据结构,如链表、队列、哈希表等,以及用于管理这些数据结构的函数。例如,可以用于存储和管理音视频帧、数据包等。
    • 错误码及错误处理 该库定义了一套错误码和错误处理机制,使得开发者在处理错误时能够更加方便和统一。
    • 日志输出 提供了灵活的日志系统(AVLog),可以记录和输出日志信息。它提供了多种日志级别,如静默、紧急、致命、错误、警告、信息、详细和调试等,
    • 其他辅助信息 还提供了其他辅助信息,如密钥、哈希值、宏、库版本、常量等。
  • libswscale 图像缩放和色彩空间转换操作,提供了一些图像过滤器,如翻转、旋转等。

    • 图像缩放 支持多种缩放算法,如最近邻、双线性、立方插值等;
    • 色彩空间转换 不同的色彩空间和像素格式之间转换图像数据,如RGB、YUV等;
    • 其他操作 提供了一些图像过滤器,如水平或垂直翻转、旋转等,以及像素格式的存储布局转换等功能
  • libswresample 音频处理库,专门用于处理音频的重采样、格式转换和混合。

    • 音频重采样 支持将音频数据从一种采样率转换为另一种采样率。
    • 格式转换 在不同的音频格式之间进行转换,如从浮点格式转换为整数格式,或从一种位深度转换为另一种位深度。
    • 声道布局转换 支持在不同的声道布局之间进行转换,如从立体声转换为环绕声,或从单声道复制为双声道。
    • 音频混合 提供了音频混合的功能,可以将多个音频流合并为一个音频流。
  • libavfilter 各种音视频滤波器,允许用户对音视频数据进行各种处理,如音视频倍速、水平翻转、裁剪、加方框、叠加文字等。libavfilter的结构类似于directShow,可以同时存在多个滤波器(filter),每个滤波器具有输入(input)及输出(output)端口,经过滤波器后,音视频数据会根据滤波器的特性进行相应处理。

    • 简单滤镜 只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的。可以理解为在非压缩数据帧到再次编码前简单附加了一步处理。
    • 复合滤镜(complex filtergraph):通常是具有多个输入输出文件,并有多条执行路径的滤镜。它允许用户将多个滤镜组合起来,形成一个复杂的滤镜链图,以实现更复杂的音视频处理需求。
  • libpostproc 提供了一系列视频后处理滤镜,用于改善和优化视频质量。如去隔行滤波、去噪滤波、锐化滤波等。这些滤镜可以应用于解码后的视频帧,以改善视频的清晰度、减少噪点和伪影等。些常用的函数和接口:

    • pp_postprocess 用于对视频帧进行后处理。它接受原始视频帧、目标视频帧、视频尺寸、QP(量化参数)存储等信息作为输入,并输出处理后的视频帧。
    • pp_get_mode_by_name_and_quality 根据给定的滤镜名称和质量参数,获取相应的滤镜模式。
    • pp_free_mode 释放由pp_get_mode_by_name_and_quality函数分配的滤镜模式。
    • pp_get_context 创建一个新的后处理上下文,用于存储后处理过程中的状态信息。
    • pp_free_context 释放由pp_get_context函数分配的后处理上下文。
  • libavdevice 提供与多媒体设备的交互接口,方便地读取或输出音视频数据到设备上,包括摄像头、麦克风、音频接口、视频接口等多种类型的设备。

    • 输入端设备
      • alsa(高级Linux声音架构,用于音频输入)
      • avfoundation(苹果系统的多媒体框架,用于音视频输入)
      • dshow(DirectShow,Windows平台上的音视频输入接口)
      • dv1394(IEEE 1394数字视频接口)
      • video4linux2(V4L2,Linux下的视频设备接口)
      • vfwcap(Windows平台上的视频捕获接口)
      • x11grab(X11窗口系统下的屏幕捕获)
      • decklink(Blackmagic Design的DeckLink系列硬件接口)
    • 输出端设备
      • alsa(音频输出)
      • caca(图形库,用于文本模式下的图形输出)
      • decklink(Blackmagic Design的DeckLink系列硬件输出)
      • fbdev(Linux帧缓冲设备,用于屏幕输出)
      • opengl(用于图形渲染的输出)
      • sdl(Simple DirectMedia Layer,用于跨平台的音视频输出)
      • sndio(音频输出接口)
      • xv(X视频扩展,用于X11系统下的视频输出)