FFmpeg深入学习 1

简介: FFmpeg深入学习

前言

上文主要讲解了 FFmpeg 相关知识,以及在 Windows 下编译 FFmpeg 源码,本文继续对 FFmpeg 进行更深入的介绍。


一、FFmpeg 基础指令

 主要参数:
  ◼ -i 设定输入流
  ◼ -f 设定输出格式(format)
  ◼ -ss 开始时间
  ◼ -t 时间长度
音频参数:
  ◼ -aframes    设置要输出的音频帧数
  ◼ -b:a      音频码率
  ◼ -ar       设定采样率
  ◼ -ac     设定声音的Channel数
  ◼ -acodec     设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。
  ◼ -an       不处理音频
  ◼ -af       音频过滤器
ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3
视频参数:
  ◼ -vframes      设置要输出的视频帧数
  ◼ -b        设定视频码率
  ◼ -b:v        视频码率
  ◼ -r        设定帧速率
  ◼ -s        设定画面的宽与高
  ◼ -vn         不处理视频
  ◼ -aspect aspect  设置横纵比 4:3 16:9 或 1.3333 1.7777
  ◼ -vcodec       设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
  ◼ -vf         视频过滤器
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 -s 640x480 -aspect 16:9 -vcodec libx265

二、FFmpeg 应用之视频播放器

1、音视频播放流程

播放一个音视频文件的流程:


解协议

将流媒体协议的数据,解析为标准的相应的封装格式数据视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。

这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。

解封装

将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据

封装格式种类很多,例如 MP4,MKV,RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。

解码

将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据

音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等

解码是整个系统中最重要也是最复杂的一个环节。

通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。

音视频同步

根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

视音频封装格式数据分为 flv、mkv、 mp4、rmvb、ts 等等格式

2、音视频同步

音视频同步的方式基本是确定一个时钟(音频时钟、视频时钟、外部时钟)作为主时钟,非主时钟的音频或视频时钟为从时钟。


在播放过程中,主时钟作为同步基准,不断判断从时钟与主时钟的差异,调节从时钟,使从时钟追赶(落后时)或等待(超前时)主时钟。


视频同步到音频的基本方法是:如果视频超前音频,则不进行播放,以等待音频;如果视频落后音频,则丢弃当前帧直接播放下一帧,以追赶音频。


按照主时钟的不同种类,可以将音视频同步模式分为如下三种:


音频同步到视频,视频时钟作为主时钟。

视频同步到音频,音频时钟作为主时钟。(常用)

  • 音视频同步到外部时钟,外部时钟作为主时钟。

三、FFplay 播放器

1、FFmpeg 播放器的整体框架

FFmpeg 播放器的整体框架图


2、ffplay 的初体验及快捷键

ffplay 是 ffmpeg 工程中提供的播放器,功能相当的强大,凡是 ffmpeg 支持的视音频格式它基本上都支持。

甚至连 VLC 不支持的一些流媒体都可以播放(比如说 RTMP),但是它的缺点是其不是图形化界面的,必须通过键盘来操作。

通过 ffplay 播放 D:\Work\test 目录下的 SampleVideo_1280x720_20mb.mp4 文件

ffplay -i SampleVideo_1280x720_20mb.mp4

可以看到视频正在被播放,按空格是暂停,左右键是快退和快进

3、ffplay 模块划分

  • 解析输入
  • 打开码流
  • 音视频队列
  • 音视频解码
  • 播放控制
  • 开始播放
  • 停止播放
  • 暂停播放
  • 跳到(seek)指定位置播放
  • 音频输出
  • 视频输出
  • ffplay 快捷键支持

4、ffplay 原理及流程


av_register_all():用于注册所有muxers、demuxers 与 protocols;

avformat_open_input():根据传入的 url 确定了要使用的协议 URLProtocol,比如 http 的或是 file 类型的协议;

av_find_stream_info():获取更多的码流信息。比如获取视频帧率、视频宽高,重新计算最大分析时长,打开解码器解码获取 codec 数据;

avcodec_find_decoder():查找解码器;

avcodec_open():打开编解码器;

av_read_frame():读取音视频帧;

avcodec_decode_video2():解码一帧视频数据;SDL 显示 YUV 图像的流程图:

  • SDL_Init():主要是初始化内存等;
  • SDL_SetVideoMode():设置显示模式,创建 SDL 窗口,并指定图像尺寸及像素个数;

SDL_Surface:是一种图片数据类型,包含了图片的全部像素点,以及渲染这张图片需要的其它数据;

SDL_CreateYUVOverlay():创建画布对象;

SDL_Overlay:用于显示YUV数据;

SDL_DisplayYUVOverlay():让 SDL 来渲染我们给它的数据;

目录
相关文章
|
Windows
【音视频 学习 ffmpeg】环境准备
【音视频 学习 ffmpeg】环境准备
|
编解码 数据安全/隐私保护
FFmpeg深入学习 2
FFmpeg深入学习
458 0
|
Android开发 计算机视觉 C++
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
音视频编程对许多程序员来说是一片充满挑战的领域,但借助如OpenCV、LearnOpenGL、FFmpeg、OBS Studio及VLC media player等强大的开源工具,可以降低入门门槛。这些框架不仅覆盖了计算机视觉、图形渲染,还包括多媒体处理与直播技术,通过多种编程语言如Python、C++的应用,使得音视频开发更为便捷。例如,OpenCV支持跨平台的视觉应用开发,FFmpeg则擅长多媒体文件的处理与转换,而VLC media player则是验证音视频文件质量的有效工具。
783 0
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
|
网络协议 应用服务中间件 Linux
【音视频 ffmpeg 学习】 RTMP推流 mp4文件
【音视频 ffmpeg 学习】 RTMP推流 mp4文件
|
数据采集 Windows
【音视频 ffmpeg 学习】麦克风数据采集,命令行播放 持续更新
【音视频 ffmpeg 学习】麦克风数据采集,命令行播放 持续更新
【音视频 ffmpeg 学习】 跑示例程序 持续更新中
【音视频 ffmpeg 学习】 跑示例程序 持续更新中
|
编解码 数据安全/隐私保护 计算机视觉
音视频学习之ffmpeg常用基础命令整理
音视频学习之ffmpeg常用基础命令整理
519 0
|
安全 语音技术
ffmpeg学习——音频源
ffmpeg学习——音频源
|
API 索引
[笔记]音视频学习之ffmpeg实践《二》ffmpeg解码
[笔记]音视频学习之ffmpeg实践《二》ffmpeg解码
188 0
|
编解码 API 数据处理
[笔记]音视频学习之ffmpeg实践《三》ffmpeg解封装
[笔记]音视频学习之ffmpeg实践《三》ffmpeg解封装
193 0