音视频基础

音视频基础

资料

FFMPEG基础

image-20220818164412470

image-20220818171815504

image-20220818172938079

image-20220818173055808

image-20220818174835502

image-20220818184820976

image-20220819101108745

image-20220819103728503

SDL基础

image-20220819111752346

image-20220819111954286

image-20220819113048640

image-20220819113611158

image-20220819115012436

image-20220819115255353

image-20220819142102059

FFmpeg和SDL实现视频播放器

播放器基本原理示意图

image-20220819145558512

视频播放

img

  • 函数说明

  • avformat_open_input:打开视频文件:读取文件头,将文件格式信息存储在"fmt context"中;

  • avformat_find_stream_info:搜索流信息:读取一段视频文件数据,尝试解码,将读取到的流信息填入pFormatCtx->streams;

  • avcodec_find_decoder:利用解编码器的id获取解解码器;

  • avcodec_open2:编解码器的初始化;

  • 调用av_read_frame()从输入文件中读取视频数据包,调用avcodec_send_packet()avcodec_receive_frame()对视频数据解码。

  • 图像格式转换的目的,是为了解码后的视频帧能被 SDL 正常显示,因为FFmpeg解码后得到的图像格式不一定就能被SDL支持,这种情况下不作图像转换是无法正常显示的。

  • 定时刷新线程 + 解码主线程,定时刷新线程按计算出的帧率发送自定义 SDL 事件,通知解码主线程。解码主线程收到 SDL 事件后,获取一个视频帧解码并显示。

  • codec:编解码器,对应数据结构 AVCodec。编码器将未压缩的原始图像或音频数据编码为压缩数据。解码器与之相反。

  • codec context:编解码器上下文,对应数据结构 AVCodecContext。此为非常重要的一个数据结构,后文分析。各API大量使用 AVCodecContext 来引用编解码器。

  • codec par:编解码器参数,对应数据结构 AVCodecParameters。新版本增加的字段。新版本建议使用 AVStream->codepar 替代 AVStream->codec。

  • packet:经过编码的数据包,对应数据结构 AVPacket。通过 av_read_frame() 从媒体文件中获取得到的一个 packet 可能包含多个(整数个)音频帧或单个视频帧,或者其他类型的流数据。

  • frame:未编码的原始数据帧,对应数据结构 AVFrame。解码器将 packet 解码后生成 frame。

  • plane:如 YUV 有 Y、U、V 三个 plane,RGB 有 R、G、B 三个 plane。

音频播放

此处指播放视频文件里面的音频,即仅播放视频文件中的声音,而不显示图像。

image-20220827170123998

注意

  1. 一个音频 packet 中含有多个完整的音频帧,此函数每次只返回一个 frame,当 avcodec_receive_frame() 指示需要新数据时才调用 avcodec_send_packet() 向编码器发送一个 packet;
  2. 音频 frame 中的数据格式未必被 SDL 支持,对于不支持的音频 frame 格式,需要进行重采样,转换为 SDL 支持的格式声音才能正常播放;
  3. 解码器内部会有缓冲机制,会缓存一定量的音频帧,不冲洗(flush)解码器的话,缓存帧是取不出来的,未冲洗(flush)解码器情况下,avcodec_receive_frame() 返回 AVERROR(EAGAIN),表示解码器中改取的帧已取完了(当然缓存帧还是在的),需要用 avcodec_send_packet() 向解码器提供新数据;
  4. 文件播放完毕时,应冲洗(flush)解码器。冲洗(flush)解码器的方法就是调用 avcodec_send_packet(…, NULL),然后按之前同样的方式多次调用 avcodec_receive_frame() 将缓存帧取尽。缓存帧取完后,avcodec_receive_frame() 返回 AVERROR_EOF。

视频播放原理

image-20220816205644041

从**解复用器(Media Extractor、AVFormatContetext->stream)**开始,会有两个线程分别负责解析音频和视频。

视频录制原理

image-20220816210829244

音频:PCM->ACC数据,视频:YUV->H264,音视频封装:FLV / MP4。

视频基础

image-20220816211345227

image-20220816211444642

image-20220816235418014

I帧是一个关键帧,能够独立解码并显示画面,可指定I帧出现的频率。

image-20220817000235403

image-20220817001056825

常用的是H264。

音频基础

image-20220817001217037

image-20220817002757829

开源项目

image-20220817003353303

image-20220817003514569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海岸星的清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值