从0开始写Qt视频播放器----90行代码写一个视频播放器

上一篇文章视频播放器的技术组成写了视频播放器的整体结构

下面我们就来上伪代码:

#include <iostream>
#include <thread>
#include <list>
#include <string>
using namespace std;

//下文代码都需要考虑并发,并发代码没写是为了清晰思路
typedef void* handle_t;

struct h264_package
{
    int data_length = 0;//1个音频包,或者视频包的字节数
};

struct yuv_package 
{
};

//从mp4文件里读到的数据
list<h264_package> h264_package_list;
//解码h264得到的yuv数据
list<yuv_package> yuv_package_list;

handle_t read_mp4_file(string file_name) {}
//从头到尾,依次读取视频帧,音频帧
h264_package read_from_mp4_by_ffmpeg(handle_t handle)
{
    return h264_package();
}
yuv_package decode_h264_by_ffmpeg(h264_package package)
{
    return yuv_package();
}
void opengl_rander_yuv(yuv_package package)
{
}

void read_file_thread_fun(void* handle)
{
    h264_package package;
    while (true)
    {
        package = read_from_mp4_by_ffmpeg(handle);
        if (package.data_length == 0)
        {
            break;//读取mp4文件结束
        }
        h264_package_list.push_back(package);//这里需要考虑并发
    }
}
void decode_h264_thread_fun(void)
{
    while (true)
    {
        if (!h264_package_list.empty())
        {
            h264_package package;
            auto package = h264_package_list.front();
            h264_package_list.pop_front();

            auto yuv = decode_h264_by_ffmpeg(package);

            yuv_package_list.push_back(yuv);
        }
    }
}
void rendering_thread_fun(void)
{
    while (true)
    {
        if (!yuv_package_list.empty())
        {
            auto package = yuv_package_list.front();
            yuv_package_list.pop_front();
            //把数据通过OpenGL接口传递给显卡,使用显卡将yuv数据转换为RGB数据渲染到显卡输出
            // ,显卡输出连接显示器显示
            opengl_rander_yuv(package);
        }
    }
}
int main(void)
{
    auto handle = read_mp4_file("av.mp4");

    thread read_frame_thread(read_file_thread_fun, handle);
    thread decode_h246_thread(decode_h264_thread_fun);
    thread rendering_thread(rendering_thread_fun);

    rendering_thread.join();
    decode_h246_thread.join();
    read_frame_thread.join();

    return 0;
}

仅供参考,后面的教程我们来让它变成真实的播放器。

敬请期待!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C++程序员Carea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值