题记:这节开始学习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函数库
-
libavformat专注于媒体容器格式的封装和解封装操作,支持从网络流、本地文件甚至内存缓冲区中读取数据。封装(Muxing)是将多个媒体数据流(如视频、音频、字幕等)组合并写入到指定的容器格式文件中,如MP4、MKV、FLV等。解封装(Demuxing)则是相反的过程,即将一个媒体文件分割为多个多媒体流。关键结构体:AVFormatContext存储关于输入输出文件的全部信息。如输入或输出(iformat或oformat)、基本流数组(streams)、I/O上下文(pb)。AVInputFormat与AVOutputFormat描述支持的输入输出容器格式。AVPacket数据包含已编码的帧数据;AVStream基本流,包含了与流相关的编解码器、数据段等信息
-
libavcodec用于音视频各种格式的编解码,能够将音视频数据从一种格式解码为原始的音视频流,或者将原始的音视频流编码为指定格式。主要功能:音视频编解码涵盖了几乎所有常见的音视频格式。例如,H.264、HEVC、MPEG-4、VP9 等视频编码器,以及 AAC、MP3、Opus 等音频编码器。硬件加速支持硬件加速,利用 GPU、DSP 等硬件资源来加速音视频编解码。滤镜处理可以对音视频数据进行处理操作,例如加噪声、去噪声、调整亮度、对比度等。伸缩和重采样对音频数据进行伸缩和重采样的操作,以适应不同采样率、声道数等需求。字幕处理支持对视频中的字幕进行解析
-
libavutil包含一些公共的工具函数的使用库(C语言)。包括了数学函数丰富的数学函数,包括对数计算、最大公约数计算、按比例转换数值等。内存管理动态内存分配和释放的函数,如av_malloc、av_mallocz、av_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系统下的视频输出)
- 输入端设备: