音视频项目—基于FFmpeg和SDL的音视频播放器解析(十一)

news/2024/7/10 22:23:02 标签: 音视频, ffmpeg

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十)

解析

我们这一篇文章讲解 AVFrameQueue,先看 .h 文件代码

#ifndef AVFRAMEQUEUE_H_
#define AVFRAMEQUEUE_H_

#include"queue.h"

#ifdef __cplusplus

extern "C" {
#include"libavutil/avutil.h"
#include"libavformat/avformat.h"
#include"libavcodec/avcodec.h"
}

#endif

class AVFrameQueue{
public:
    AVFrameQueue();
    ~AVFrameQueue();
    void Abort();
    int Push(AVFrame* val);
    AVFrame* Pop(const int timeout);
    AVFrame* Front();
    int Size();
private:
    void release();
    Queue<AVFrame*> queue_t;
};

#endif

整体上看,与 AVPacketQueue 的函数没有什么区别,都是 Abort,Push,Pop,Front,Size,release,只是存放的数据不一样,一个放的是包(Packet),一个放的是帧(Frame)。

我们来看一下函数的实现

Abort:
void AVFrameQueue::Abort(){
    release();
    queue_t.Abort();
}

这函数负责程序的中断,先调用了 release 函数释放了队列的数据,在调用 Queue 父类的 Abort 方法终止程序。

Push:
int AVFrameQueue::Push(AVFrame* val){
    return queue_t.Push(val);
}

这函数负责队列的增加数据。直接调用 Queue 父类的 Push 方法,很好理解。

Pop:
AVFrame* AVFrameQueue::Pop(const int timeout){
    AVFrame* av_frame = nullptr;
    int ret = queue_t.Pop(av_frame, timeout);
    if(ret < 0){
        perror("AVFrameQueue:: Pop failed");
    }
    return av_frame;
}

这函数负责队列弹出数据。由于这个 Queue 父类的方法需要讲弹出的数据赋值给参数,因此我们需要在函数头部增加一个 AVFrame 的变量,用来传递给函数。

Front:
AVFrame* AVFrameQueue::Front(){
    AVFrame* av_frame = nullptr;
    int ret = queue_t.Front(av_frame);
    if(ret < 0){
        perror("AVFrameQueue:: Front failed");
    }
    return av_frame;
}

这函数负责返回队列的首部数据。这也很好理解,直接调用 Queue 父类的 Front 函数。

Size:
int AVFrameQueue::Size(){
    return queue_t.Size();
}

这函数负责返回队列的长度。直接调用 Queue 的 Size 方法即可。

release:
void AVFrameQueue::release(){
    while(true){
        AVFrame* av_frame = nullptr;
        int ret = queue_t.Pop(av_frame, 1);
        if(ret < 0){
            break;
        }else {
            av_frame_free(&av_frame);
        }
    }
}

这函数负责释放队列的所有元素。函数有一个 while 的死循环,然后不断 Pop 队列的数据,直到没有为止,跳出循环。

好了,Queue,AVPacketQueue,AVFrameQueue 都讲完了。下一篇文章我们会讲音视频同步的机制以及如何实现。

欲知后事如何,请听下回分解。


http://www.niftyadmin.cn/n/5194561.html

相关文章

vue之Error: Unknown option: .devServer.

背景 在使用内网穿透工具时&#xff0c;加入对应的配置&#xff0c;启动出现报错。 一、遇到的问题 报错&#xff1a; Error: Unknown option: .devServer. Check out https://babeljs.io/docs/en/babel-core/#options for more information about options. Error: Unknown …

CentOS 安装etcd集群 —— 筑梦之路

环境说明 192.168.1.11 192.168.1.12 192.168.1.13 yum在线安装 yum install etcd -y #etcd01 cat > /etc/etcd/etcd.conf <<EOF ETCD_NAMEetcd01 ETCD_LISTEN_PEER_URLS"http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS"http://0.0.0.0:2379&quo…

【Linux】:体系结构与进程概念

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux体系结构和进程的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

【测开求职】面试题:HR面相关的开放性问题

每一面可能都会穿插一些岗位理解的问题,有一些问题是真的挺不好回答的,最好还是提前准备一下,本篇文章总结了在面测试开发岗位中遇到的一些开放性问题👉 目录 💗如何理解测试开发💗为什么选择测试💗如何学习测试开发近期的职业规划前面面试的总结说一下你的优缺点最…

springboot集成nacos并实现自动刷新

目录 1.说明 2.示例 3.自动刷新的注意点 1.说明 springboot项目中存在好多配置文件&#xff0c;比如配置数据信息&#xff0c;redis信息等等&#xff0c;配置文件可以直接放在代码&#xff0c;也可以放在像nacos这样的组件中&#xff0c;实现动态的管理&#xff0c;修改配置…