在FFmpeg的player中用到了SDL多线程,去读取音视频文件,解码音频,解码视频,解码字幕,读写队列;来看SDL_Thread,SDL_cond,SDL_mutex关系
SDL是一个c语言写的多媒体库,功能非常强大,并且支持音视频渲染,有的游戏中也有用到;
直接看代码注释:
// sdlthread.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "SDL.h"
SDL_cond* cond = SDL_CreateCond(); //创建一个条件信号量
SDL_mutex* mutex = SDL_CreateMutex();创建一个互斥锁
int index = 0;
//第一个线程函数
static int MyThread(void *data) {
while (1) {
SDL_LockMutex(mutex);//线程启动后,先加锁
index++;
std::cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << index << "\n";
if (index % 2 == 0) {
SDL_CondSignal(cond);//条件满足,发送信号,告诉第二个线程可以执行了;
SDL_UnlockMutex(mutex);//解锁
SDL_CondWait(cond, mutex);//继续等待其他线程发信号;
}
}
return 0;
}
//第二个线程函数
static int YouThread(void* data) {
while (1) {
SDL_LockMutex(mutex);//线程启动后,先加锁
index++;
std::cout << "***********************************************" << index << "\n";
if (index % 2 != 0) {
SDL_CondSignal(cond);//条件满足,发送信号,告诉第二个线程可以执行了;
SDL_UnlockMutex(mutex);//解锁
SDL_CondWait(cond, mutex);//继续等待其他线程发信号;
}
}
return 0;
}
#undef main;
int main()
{
SDL_Thread *threaMy = SDL_CreateThread(MyThread,"MyThread", NULL);创建线程1
SDL_Thread *threadYou = SDL_CreateThread(YouThread, "YouThread", NULL);创建线程2
SDL_WaitThread(threaMy, 0);//启动线程1
SDL_WaitThread(threadYou, 0);//启动线程2
return 0;
}
该博客探讨了如何在FFmpeg播放器中利用SDL实现多线程,包括读取音视频文件、解码音频和视频、解码字幕以及队列操作。通过SDL_Thread、SDL_cond和SDL_mutex等工具,详细阐述了多线程在多媒体处理中的应用。
2万+

被折叠的 条评论
为什么被折叠?



