精通Docker第三版第九章更新中...

FFmpeg音视频核心技术与实战

Coding Alan 5个月前 (11-13) 512次浏览 0个评论

音视频的广泛应用

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

FFmpeg 日志系统

播放器架构 & 渲染流程

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

FFmpeg音视频核心技术与实战

指针与数组

指针就是内存地址: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编解码实战

演示代码:GitHub 仓库

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编码

H264编码流程

  • 查找编码器(avcodec_find_encoder_by_name)
  • 设置编码参数,并打开编码器(avcodec_open2)
  • 编码(avcodec_encode_video2)

实战-视频转图片

FFmpeg AAC 编解码

  • 查找编码器(avcodec_find_encoder_by_name)
  • 设置编码参数,并打开编码器(avcodec_open2)
  • 编码(avcodec_encode_audio2)

FFmpeg SDL音视频渲染实战

SDL(Simple DirectMedia Layer),是由 C 语言实现的跨平台的媒体开源库,多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

编译安装

使用 SDL基本步骤

  • 添加头文件#include <SDL.h>
  • 初始化 SDL(SDL_Init)
  • 退出 SDL(SDL_Quit)

SDL_CreateWindow()/SDL_DestroyWindow()

SDL_CreateRenderer()/SDL_DestroyRenderer()/SDL_RenderClear()/SDL_RenderPresent()

SDL事件种类

  • SDL_WindowEvent:窗口事件
  • SDL_KeyboardEvent:键盘事件
  • SDL_MouseMotionEvent:鼠标事件

事件处理:SDL_PollEvent, SDL_WaitEvent, SDL_WaitEventTimeout

SDL渲染基本原理

FFmpeg音视频核心技术与实战

SDL纹理相关 API

  • SDL_CreateTexture()
    • format:YUV, RGB
    • access: Texture 类型, Target, Stream
  • SDL_DestroyTexture()
  • SDL_SetRenderTarget()
  • SDL_RenderClear()
  • SDL_RenderCopy()
  • SDL_RenderPresent()

YUV 视频播放器

创建线程

  • SDL_CreateThread
    • fn:线程执行函数
    • name:线程名
    • data:执行函数参数

SDL 更新纹理

  • SDL_UpdateTexture()
  • SDL_UpdateYUVTexture()

SDL音频处理

播放音频基本流程:打开音频设备->设置音频参数->向声卡喂数据->播放音频->关闭设备

播放音频的基本原则

  • 声卡向你要数据而不是你主动推给声卡
  • 数据的多少由音频参数决定的

SDL 音频 API

  • SDL_OpenAudio/SDL_CloseAudio
  • SDL_PauseAudio
  • SDL_MixAudio

 

正在更新中…

常见问题

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
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址