ffmpeg简易播放器的实现-完善版 (4)

源码清单中涉及的一些概念简述如下:
container:
对应数据结构AVFormatContext
封装器,将流数据封装为指定格式的文件,文件格式如AVI、MP4等。
FFmpeg可识别五种流类型:视频video(v)、音频audio(a)、attachment(t)、数据data(d)、字幕subtitle。

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

slice:
图像中一片连续的行,必须是连续的,顺序由顶部到底部或由底部到顶部

stride/pitch:
一行图像所占的空间字节数,Stride = BytesPerPixel * Width,x字节对齐[待确认]

sdl window:
对应数据结构SDL_Window
播放视频时弹出的窗口。在SDL1.x版本中,只可以创建一个窗口。在SDL2.0版本中,可以创建多个窗口。

sdl texture:
对应数据结构SDL_Texture
一个SDL_Texture对应一帧解码后的图像数据。

sdl renderer:
对应数据结构SDL_Renderer
渲染器。将SDL_Texture渲染至SDL_Window。

sdl rect:
对应数据结构SDL_Rect
SDL_Rect用于确定SDL_Texture显示的位置。一个SDL_Window上可以显示多个SDL_Rect。这样可以实现同一窗口的分屏显示。

2.3 帧率控制-定时刷新机制

将上一版代码拆分为两个线程:定时刷新线程 + 解码主线程。
定时刷新线程每40ms发送一个自定义SDL事件,通知解码主线程
解码主线程收到SDL事件后,获取一个视频帧解码并显示

3、编译 gcc -o ffplayer ffplayer.c -lavutil -lavformat -lavcodec -lavutil -lswscale -lSDL2 4、测试 ./ffplayer 480x272.h265 5、参考资料

[1] 雷霄骅,视音频编解码技术零基础学习方法”
[2] 雷霄骅,FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
[3] 雷霄骅,最简单的基于FFMPEG+SDL的视频播放器ver2(采用SDL2.0)
[4] Martin Bohme,
[5] Martin Bohme,
[6] YUV图像里的stride和plane的解释
[7] 图文详解YUV420数据格式
[8] YUV,https://zh.wikipedia.org/wiki/YUV

6、修改记录

2018-11-23 V1.0 初稿
2018-11-29 V1.1 增加定时刷新线程,使解码帧率更加准确

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxffg.html