FFmpeg音视频核心技术与实战

音视频的广泛应用

  • 直播类:音视频会议、教育直播、娱乐/游戏直播等
  • 短视频:抖音、快手、小咖秀等
  • 网络视频:优酷、腾讯视频、爱奇艺等
  • 音视频通话:微信、QQ、Skype 等
  • 视频监控
  • 人工智能:人脸识别、智能音箱等,更关注算法

FFmpeg 日志系统

 

播放器架构 & 渲染流程

播放器架构 & 渲染流程

本文主要内容

安装

GitHub 地址:https://github.com/FFmpeg/FFmpeg

Windows 下安装 FFmpeg

FFmpeg常用命令实战

FFmpeg 音视频处理流程

FFmpeg 滤镜命令

FFmpeg 常用命令

FFmpeg开发必备C语言回顾

Vim 编辑器

演示代码: GitHub仓库

常用基本类型

整型:short、int、long
浮点型:float、double
Char 型:char
无符号型:void

内存管理

指针与数组

指针就是内存地址:void*、char*

数组:char c[2]、int arr[10]

结构体、枚举类型

文件操作
文件类型 FILE* file;
打开文件 FILE* fopen(path, mode); // a+
关闭文件 fclose(FILE*);

 

内存的分配和释放
分配内存 void* mem = malloc(size);
释放内存 free(mem);
内存泄漏和野指针
不断地向系统申请内存
申请的内存不用,也不释放
占用别人的内存称作野指针

 

C语言编译器


预编译→编译→链接(动态链接 /静态链接)

调试器(gdb/lldb)

FFmpeg多媒体文件处理

演示代码:GitHub 仓库

FFmpeg 代码结构

  • libavcodec: 提供了一系列编解码器的实现
  • libavformat: 实现在流协议,容器格式及其本IO访问
  • libavutil: 包括了hash器,解码器和各利工具函数
  • libavfilter: 提供了各种音视频过滤器
  • libavdevice: 提供了访问捕获设备和回放设备的接口
  • libswresample: 实现了混音和重采样
  • libswscale: 实现了色彩转换和缩放工能

多媒体文件的基本概念

  • 多媒体文件其实是个容器
  • 在容器里有很多流(Stream/Track)
  • 每种流是由不同的编码器编码的
  • 从流中读出的数据称为包
  • 在一个包中包含着一个或多个帧

见个重要的结构体

  • AVFormatContext
  • AVStream
  • AVPacket

FFmpeg 操作流数据的基本步骤

解复用➞获取流➞读数据包➞释放资源

打印音/视频信息

抽取音频数据

抽取视频数据

◆Start code
◆SPS/PPS
◆codec→extradata

格式互转

  • avformat_alloc_output_context2()/avformat_free_context()
  • avformat_new_stream()
  • avcodec_parameters_copy()
  • avformat_write_header()
  • av_write_frame()/av_interleaved_write_frame()
  • av_write_trailer()

视频截取 

av_seek_frame()

FFmpeg编解码实战

FFmpeg H264解码

libavcodec/avcodec.h

常用数据结构

  • AVCodec 编码器结构体
  • AVCodecContext 编码器上下文
  • AVFrame 解码后的帧

结构体内存的分配与释放

  • av_frame_alloc/av_frame_free()
  • avcodec_alloc_context3()
  • avcodec_free_context()

解码步骤

  • 查找解码器(avcodec_find_decoder)
  • 打开解码器(avcodec_open2)
  • 解码(avcodec_decode_video2)

FFmpeg H264编码

FFmpeg AAC 编解码

 

正在更新中…

常见问题

1、nasm/yasm not found or too old. Use –disable-x86asm for a crippled build.

2、ERROR: libfdk_aac not found

3、warning: ‘av_register_all’ is deprecated

修改为:

4、MacOS Mojave ffplay 只播放声音不显示画面

解决办法:

  • 方法一:
    • 从 SDL下载 2.0.9版本或以后的SDL2代码。
    • 执行 ./configure
    • 执行 make && sudo make install
    • 执行 export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
    • [重新]编译ffmpeg
  • 方法二
    • SDL下载dmg包。
    • 执行 open SDL2-2.0.9.dmg
    • [重新]编译ffmpeg

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.