在前一节中,我们实现了QT,将视频从网络保存到本地磁盘。而且,网络上99%的数据都是这么做的,即在活动结束时,所有下载的数据一口气保存到磁盘上。这个时候数据都在内存里,一起保存有点压力。如果遇到非常大的文件,也会因为内存不足而导致错误。
让我们在阅读时尽量节省。
我们需要定义并实现一个功能,将数据存储到磁盘,以响应网络中的数据到达:
Void主窗口:下载readyread()//读写{ echo(' downloadReadyRead ');while(!reply _ download-ATend()){ FP-write(reply _ download-readAll());}}
然后在开始下载后绑定这个信号槽:
//绑定数据到达事件connect (reply _ download,signal (readyread())、this、slot(downloareadyread());
请记住,必须记录事件和响应函数没有参数,如果写入参数,信号将永远不会响应。
因为文件读写时间是随机的、被动的。因此,要定义一个对整个类可用的文件私有变量:
//main window . h-private : qfile * FP;
然后定义文件打开和关闭操作的两个函数,只能调用一次。
void mainwindow : video file open(){ qsrand(time(NULL));int n=qrand()% 9999;//生成4位随机数//获取当前日期和时间qdatetime cordatetime=qdatetime :3360 current datetime();//格式化日期和时间qstring fname=cordatetime . tostring(' yyymmdhhmmss ')' _ ' qstring :3360 number(n)' . MP4 ';QString SavePath=ui-le _ DirPath-text()'/';QString FileName=savePath fNamethis-video FileName=FileName;fp=新的QFile(这个);//注意,如果有这个,不需要自己删除。如果没有这个,一定要记得删除,否则会出现内存泄漏FP-setFileName(FileName);FP-open(qiodevices : write only | qiodevices : runcate);} void mainwindow : video file close(){ FP-flush();FP-close();删除FP;}
开始下载功能和结束下载功能以及数据响应功能:
Void主窗口:开始下载(qstring URL){//解析后,调用此函数开始下载QUrl URL(URL);//设置请求头QNetworkRequest请求;request . setURl(URL);request . setheader(qnetworkrequest : content type header,' application/x-www-form-URL encoded ');videoFileOpen();//创建并打开本地视频文件reply _ download=Nam _ download-get(请求);//绑定下载进度事件connect (reply _ download,signal(下载进度(qint64,qint64))、this,slot(下载进度(qint64,qint 64)));//绑定数据到达事件connect (reply _ download,signal (readyread())、this、slot(downloareadyread());} void主窗口:下载readyread()//读写{while(!reply _ download-ATend()){ FP-write(reply _ download-readAll());}} void主窗口:完成慢速下载(qnetworkreply * reply){//下载视频流//解除绑定进度条槽事件功能断开(reply,signal(下载进度(qint64,qint64))),this,slot(下载进度(qint64,qint64))。//绑定数据到达事件断开(回复,信号(readyread()),此,slot(downloareadyread()));if(reply _ download-error()==qnetworkreply : norerr){ videoFileClose();Echo('保存了: ' this-video filename);Lb_statusText-setText('下载完成');} else {//出现http错误回应(reply _ download-error string());} reply _ download-delete late();}
至此,实现了边下载边保存的功能。
其实按照理论,这种下载和文件读写操作应该通过编写子类来实现,这样代码才会更清晰、更科学。但是我懒得去做,因为功能差不多。反正代码我能看懂,编译器也能看懂,电脑也能正常运行。
下面的容错处理和小改动我就不写了。
下一节我们来实现预览功能,看看QT是如何播放在线视频的。