第2课 使用FFmpeg读取rtmp流并用openCV显示视频
本课对应源文件下载链接:
https://download.youkuaiyun.com/download/XiBuQiuChong/88801295
这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本的功能其实就两个:显示画面和播放声音。在实现这两个功能前,我们需要先用ffmpeg连接到rtmp服务器,当然也可以打开一个文件。
一、最终实现的效果
二、使用FFmpeg读取rtmp流并用openCV显示的原理
要显示视频画面,就要先用FFmpeg拉取rtmp流,rtmp流中既有视频流也有音频流,FFmpeg对其中的视频流进行解码获取到视频帧,然后将视频帧用openCV转换为Mat数组,最后用openCV将Mat数组显示出来就可以了。用openCV将Mat数组显示的时候,会弹出新的窗口,不太符合常规需求,可以进一步把Mat数组绘制到MFC窗口以达到上图显示的效果。
三、rtmp播放器实现的主要代码
1.压缩备份上节课工程文件夹为demo.rar,并修改工程文件夹demo为demo2,及时备份源文件并在原基础上继续迭代开发是一种好习惯。
2.打开fmlp.cpp,修改其中的删除原来init函数中的代码,并加入以下代码:
runFFmpegHandle = CreateThread(NULL, 0, runFFmpegThreadProc, (LPVOID)this, 0, NULL);
如果把MFC对话框相关代码看作主线程函数的话,上述代码的作用是新建一个线程,并在新的线程中执行与ffmpeg及opencv有关的操作。这样做的好处就是实现了“各司其责”,MFC所在的主线程主要用来处理UI(界面)方面的工作,ffmpeg及opencv子线程主要用来处理网络连接、图形处理等方面的工作,互不影响,简洁高效。
3.因为我们需要连接rtmp服务器,所以我们需要在fmlp.h中增加一个字符串类型的rtmp地址;另外还需要定义子线程句柄及相关函数:
CString inRtmpURL;
HANDLE runFFmpegHandle;
static DWORD WINAPI runFFmpegThreadProc(LPVOID lpParam);
int runFFmpeg();
BOOL isRunning = false;