本来想到南海研究站做DSP相关的工作,不过做视频编解码相关工作也很有意思。
1、功能说明
本软件实现了点对点的实时桌面录像传输,接收端采用VLC、FFMPEG可以实时播放发送的桌面录像,达到了每秒15帧的刷新率。采用不失真方式压缩桌面大小,编码成264码流,进一步利用tsmux将264码流文件转换成ts流,当ts缓冲区大于188字节后自动调用UDP点对点发送出去。
2、设计流程
本软件的最终成品是一个不断发送ts码流的软件,ts码流是视频流的包装,因此本软件最要是得到一个视频流,我们采用X264来编码产生H.264视频流。 X264的工程源码主要分四个层次,而底下三个层次(帧层、条带层、宏块层)已经封装在libx264d.lib里面,一般情况下是不需要对lib工程进行修改。 X264的最上一层,主函数层,主函数层提供给用户一个接口,输入视频图像原始的YUV数据,即可输出编码好的264码流数据。根据主函数的提供的接口,我们首先需要将屏幕截取下来然后缩小到我们期望的大小(图像越大编码时间越长,帧率将会越小),截屏区域以及压缩后的大小通过宏定义实现便捷修改,本程序中,我采用了CImage类创建图像,然后从屏幕得到图像并用不失真的方式得到期望的缩小的图像,进而得到图像的RGB值,再通过优化的YUV计算公式(将复杂乘除改成了简单乘除及移位)得到一帧图像的YUV数据,然后将数据YUV数据赋值给X264编码的PIC变量,再调用encode_frame()完成一帧编码并得到264码流文件。然后调用tsmux将264码流文件打包成ts流数据丢进发送缓冲区,tsmux自动将数据188字节一次一次通过UDP发送出去。 程序流程图如下: 本程序将以上流程图做成了死循环,不断截取屏幕丢给TSmux打包。需要注意的是,从获取屏幕数据到完成ts打包后,计算出所花时间T1,然后根据宏定义的X264参数fps帧率,计算出两次获取屏幕的时间间隔为T0=1000/fps毫秒,然后再休眠(T0-T1)毫秒即可保证屏幕录像的原始数据与264码流数据的帧率一致。
3、使用说明
使用本程序需要一台windowsXP或更新操作系统的计算机以及VLC播放器,本程序的UDP发送设置为发送到本地的10888端口(127.0.0.1:10888),可根据实际需要修改UDP.cpp里面的相关参数。 首先我们打开VLC.exe,点击“媒体”=》“打开网络串流”,如下图 在输入框内输入网络URL,VLC需要播放的是发送到本计算机的某个端口的UDP数据,所以地址写成“udp://@:10888”,然后点击播放,如果发送ts流程序已经工作,则可能需要等待一分钟捕捉到ts流包头以及时间戳信息。如果打开vlc后才立马打开发送ts流程序,则可以立即播放发送过来的实时屏幕录像。 如果不是发送给本地,需要将程序中UDP.cpp的UDP参数进行修改,然后重新编译生成X264_TS.exe,然后直接双击运行X264_TS.exe即可实现本地屏幕录像实时发送出去。
发表回复