FFMPEG视音频编解码零基础学习方法

背景知识

FFmpeg是一个强大的开源软件项目,包含一套大量的库和程序,用于处理多媒体数据。它可以编码、解码、流式传输、过滤和播放几乎任何人类和及其创建的音频和视频。

  • 使用FFMPEG作为内核视频播放器
    Mplayer、 ffplay 射手播放器 暴风影音 KMPlayer QQ影音

  • 使用FFMPEG作为内核的DirectshowFilter
    ffdshow lav filters

  • 使用FFMPEG作为内核的转码工具
    ffmpeg 格式共厂

1.转换视频格式:

ffmpeg -i 输入文件.mp4 输出文件.avi

2.从视频中提取音频:

ffmpeg -i 输入文件.mp4 -vn -acodec copy 输出文件.mp3

3.转换音频格式:

ffmpeg -i 输入文件.mp3 -acodec pcm-sl6le -ar 44100 -ac 2 输出文件.wav

4.从视频中提取帧

ffmpeg -i 输入文件.mp4 -vf fps=1/10 输出%d.png

5.调整视频大小:

ffmpeg -i 输入文件.mp4 -vf scale=1280:720 输出文件.mp4

6.连接视频:

ffmpeg -i "concat:输入文件1.mp4|输入文件2.mp4" -c copy 输出文件.mp4

ffplay.exe使用

ffplay是FFmpeg提供的一个用于播放音频和视频的简单命令行播放器。它支持几乎所有的音频和视频格式,并且可以在Windows、Linux和macOS等操作系统上运行。

ffplay 文件路径  //要播放名为example.mp4的视频文件  ffplay example.mp4

windows下编译安装ffmpeg

pacman -Syu
  • 3.安装编译工具和依赖项
    执行命令来安装编译工具和FFmpeg的依赖项
pacman -S mingw-w64-x86_64-toolchain 
pacman -S mingw-w64-x86_64-yasm 
pacman -S mingw-w64-x86_64-SDL2 
pacman -S mingw-w64-x86_64-fdk-aac 
pacman -S mingw-w64-x86_64-x264 
pacman -S mingw-w64-x86_64-x265
pacman -S mingw-w64-x86_64-gcc
pacman -S make diffutils pkg-config git nasm
  • 4.获取FFmpeg源代码
git clone https://git.ffmpeg.org/ffmpeg.git
  • 5.准备好源码并新建两个目录
  • 6.切换到目录
    使用./configure命令配置选项
  • 7.make工具编译安装
make -j8
make install
  • 8.这个编译时间较长需要等待

代码介绍

  • libavcodec: 这个目录包含了FFmpeg中所有的解码器编码器

  • libavformat: 这个目录包含了FFmpeg中音视频格式的封装和解封装器。

  • libavutil: 这个目录包含了一些通用的工具函数和数据结构,被其他部分的代码广泛使用。

  • libswscale: 这个目录包含了图像缩放颜色空间转换相关的代码。

  • libswresample: 这个目录包含了音频重采样相关的代码。

  • libavfilter: 这个目录包含了FFmpeg中的滤镜系统相关的代码。

  • libavdevice: 这个目录包含了FFmpeg中的设备支持相关的代码,如摄像头、音频设备等。

  • libpostproc: 这个目录包含了一些后处理相关的代码,例如视频去隔行、降噪等。

  • libavfilter: 这个目录包含了FFmpeg中的滤镜系统相关的代码。

  • fftools: 这个目录包含了一些工具程序,例如命令行工具ffmpeg、ffplay等。

FFMPEG中结构体很多。最关键的结构体可以分成以下几类:

  • AVFormatContext(flv,avi,rmvb,mp4)
    :AVFormatContext是FFmpeg中最关键的结构体之一,它用于表示一个音视频格式的上下文。在解封装过程中,它包含了解封装器的状态信息,包括音视频的信息、封装格式的信息等。

  • AVCodecContext(h264,mpeg2,aac,mp3)
    AVCodeContext是表示一个编解码器的上下文,包含了编解码器的状态信息和参数设置。它包括了编码器或解码器的所有必要信息,如编码/解码参数、编码/解码过程中的缓冲区等。

  • AVFrame(存数据)
    AVFrame是用于表示一帧音视频数据的结构体,它包含了音视频帧的数据以及与该帧相关的元数据。在解码过程中,解码器将音视频数据解码为AVFrame格式进行处理,在编码过程中,编码器将AVFrame编码为特定格式的压缩数据。

  • AVPacket:AVPacket是表示一段音频数据的结构体,它包含了音视频数据的压缩编码数据以及与该数据相关的元数据。在解封装过程中,接封装器将音视频数据封装为AVPacket格式进行处理,在封装过程中,封装器将AVPacket格式进行处理,在封装过程中,封装器将AVPacket封装为特定格式的音视频流。

  • AVFilterContext:AVFilterContext是表示一个滤镜的上下文,它包含了滤镜的状态信息和参数设置。在滤镜

  • AVIOContext:AVIOContext(http,rtsp,rtmp,mms)
    是用于表示音视频输入输出的上下文,它包含了音视频输入输出的状态信息和参数设置。在FFmpeg中,AVIOContext用于管理音视频数据的输入输出流,包括文件读写、网络传输等操作。

互相作用的流程图

开始
 |
 V
AVFormatContext
 |
 V
 读取音视频文件
 |
 V
 封装格式判断
 |
 V
 音视频流提取
 |
 V
 解码器选择
 |
 V
 设置编解码参数
 |
 V
 开始编解码过程
 |
 V
 解码器解码
 |
 V
 处理解码后的数据
 |
 V
 结束

posted @ 2024-03-08 20:41  不会笑的孩子  阅读(269)  评论(0编辑  收藏  举报