持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情。
之前有对vlc的资源plugins文件夹做删减功能,如果有需要的可以查看这里:Qt使用Vlc3.0.17版本资源删减解决方法
接下来用到的vlc中plugins的第二种复杂筛选方法:播放网络视频并缓存到本地
需要用到的资源包都在上一篇文章中记录了,今天就来讲述下如何进行网络视频的下载。
1:播放网络视频API
m_pVLC_Media = libvlc_media_new_location(m_pVLC_Inst, sChangePath.c_str());
路径:sChangePath,一定是一个utf的字符串,否则视频是播放不出来的。
2:接下来在需要对播放的网络视频进行缓冲区处理
libvlc_media_add_option(m_pVLC_Media, ":network-caching=200");
3:将视频下载到本地
这也是这篇文章的重点!
std::string sdata = ":sout=#duplicate{dst=display,dst=std{access=file,mux=mp4,dst=" + sDownPath + "}}";
libvlc_media_add_option(m_pVLC_Media, (const char*)sdata.c_str());
查阅了更多资料,终于找到了,很是不容易!
在程序中,根据实际的业务需求,从http上访问的视频都是mp4的格式,所以mux = mp4,这里写的是视频后缀。
在这里sDownPath并没有做utf8转换,是因为经过网上转码之后的视频名称,一定是非中文的,所以,这里我就没做转码处理了。
后面的使用就与普通的本地视频一致了,重点是第3步骤。
在使用过程中我发现了这样一个问题:当我对需要下载的视频进行快进操作时,跳过的那些快进画面,不会缓存到本地!
这需要大家引起注意了,刚开始我还以为是缓存方法有问题,其实并不是!
影响缓存大小的是:dst=display:显示的方式输出流,边播放边缓存
在vlc中默认是关闭的。
对上述指令进行修改后:
std::string sdata = ":sout=#duplicate{dst=std{access=file,mux=mp4,dst=" + sDownPath + "}}";
进行视频播放时,开始播放后,网络视频会很快的播放完毕,根本看不清播放的什么内容。
查看本地缓存文件时,会发现,已经缓存完毕了,并且大小与网络视频的大小一致。
以上是对于是否设置dst=display的两种不同表现形式。
假设你的业务中播放的视频很短,完全可以不使用display,假设你的流视频很大,最好采用边看边缓存的方式,并且一定要记住,第一次缓存时不能做快进操作!
我是中国好公民st,一名C++开发程序猿~