• 2287阅读
  • 1回复

Qt音视频开发13-mpv录像存储 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 正序阅读 楼主  发表于: 2020-08-19

## 一、前言
用mpv来做录像存储,保存视频文件,从来都没有如此的方便,直接设置属性stream-record对应的文件路径即可,我的乖乖,一行代码,如此精简美丽大方,搞得我都不敢相信自己的眼睛,mpv除了支持主流的win、linux、mac三大操作系统外,还支持手机安卓IOS等,尤其是居然支持各种嵌入式linux,记得vlc想要在嵌入式linux上交叉编译成功的话,难于上青天,各种插件的依赖实在是太多了,直到你放弃为止,在X86的linux系统还是比较方便一些的,而在这块,mpv简直是完爆vlc啊,直接命令行都可以在嵌入式linux上安装呢,内置的ffmpeg超强解码器,使得你可以直接命令行调用mpv来播放音视频,这在一些嵌入式linux上Qt无法播放音视频的场景,非常有用,本人在全志H3板子上使用的就是mpv来播放音视频,默认GPU解码使得CPU占用极地。

前面几篇文章写过vlc的录像存储和ffmpeg的录像存储,都是同时支持了保存成一个视频文件和定时存储成不同的视频文件,这个功能都采用了同样的策略,那就开个定时器来处理,比如开启了定时存储的话,到了时间先停止录像,然后再重新开始录像,重新设置新的视频文件名称,这样来实现的,同样的在mpv这里也是这样处理的,先设置属性stream-record为空字符串则表示停止录像,然后再重新设置属性stream-record为新的文件名称即可。

## 二、功能特点
1. 多线程实时播放视频流+本地视频等。
2. 支持windows+linux+mac。
3. 多线程显示图像,不卡主界面
4. 自动重连网络摄像头。
5. 可设置是否保存到文件以及文件名。
6. 可直接拖曳文件到mpvwidget控件播放。
7. 支持h265视频流+rtmp等常见视频流。
8. 可暂停播放和继续播放。
9. 支持存储单个视频文件和定时存储视频文件。
10. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
11. 可设置画面拉伸填充或者等比例填充。
12. 可对视频进行截图(原始图片)和截屏。
13. 录像文件存储MP4文件。
14. 支持qsv、dxva2、d3d11va等硬解码。

## 三、效果图




## 四、相关站点
1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)
2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)
4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)
5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代码
```c++
void MpvThread::initSave()
{
    if (!saveFile) {
        return;
    }

    if (saveInterval == 0) {
        saveVideo(fileName);
    }
}

void MpvThread::saveVideo()
{
    if (!saveFile) {
        return;
    }

    //重新设置文件名称
    QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
    newDir(dirName);
    fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);
    saveVideo(fileName);
}

void MpvThread::saveVideo(const QString &fileName)
{
    if (mpvPlayer) {
        //转成平台的路径,否则中文目录可能不认识
        QString file = QDir::toNativeSeparators(fileName);
        QByteArray data = file.toUtf8();
        setValue("stream-record", "");
        setValue("stream-record", data.constData());
    }
}
```
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!公众号:Qt实战 QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:751439350
离线foxgod

只看该作者 1楼 发表于: 2020-08-25
你好,我一直想知道ffmpeg里面音视频同步应该如何做呢
快速回复
限100 字节
 
上一个 下一个