设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 72642|回复: 0

C++ Qt实现音视频播放

[复制链接]

76

主题

0

回帖

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2022-3-26 10:25:49 | 显示全部楼层 |阅读模式
由于最近着手的Qt项目需要视频播放 自己做的时候踩了很多坑 避免以后踩坑 故在此记录实现过程 
Qt版本 5.9 基于C++11 Qt核心组件与附加组件安装时请打钩 否则可能出现项目中缺少视频播放模块的问题
1.首先创建一个新项目 并且打开.pro项目设置文件
   112714rhatjjj1tj5pj8lj.png    新项目目录结构 2.在.pro文件中添加模块 如下所示 这是我们音视频播放的基础模块 其他设置根据自己的项目需求自行添加或修改 修改完成后ctrl+s保存文件
  1. QT += multimedia multimediawidgets//QT += core gui是新项目默认带的 不需要自己手动添加
复制代码
112716wnlwlhfzgfkjwwyk.jpg    添加模块 3.接下来我们设置界面(GUI) 双击Forms文件夹下的.ui文件 打开GUI编辑页面 如下
   112716rh50ldr2bzihww0r.png    双击.ui文件   112716v6tmy00df7gmytu0.jpg    Push Button、Widget 我们目前不做太复杂的功能 当前仅需要Push Button和Widget两种控件
Push Button我们用于控制播放 Widget用于显示视频
4.将上述两个控件 左键按住不放 拖入右侧窗口界面中 
   112716ukkazqr6sbssb67f.jpg    将控件拖入 对控件进行一些基础设置 为了增强可读性 我这里对控件名称做了一些修改 对准需要修改的控件单击右键并选择"改变对象名称"
左侧的按钮改名为pushButton_set 右侧按钮改名为pushButton_start
上面的框是Widget 这个控件拖进来后基本为透明状 仅有边框轮廓 我们改名为widget_video
ctrl+s保存文件
5.设置播放窗口
   112717vlz05fycz0imf555.jpg    右击刚刚拖入的Widget控件 点击"提升为" 这里我们需要将Widget提升为QVideoWidget
类名和头文件都写为QVideoWidget 选中全局包含 然后添加并提升
112717ezw5g55gla9pwlep.jpg
6.按钮信号设置
112717l7ptgt1j1ztvtgj1.jpg
右键第一个按钮 选择"转到槽"
   112717b7xhq01ja4yx757a.jpg    选择clicked()并点击下方OK按钮 此时我们会跳转到代码编辑页面
112717bfvimzen01gaacal.jpg
在写代码之前 我们还需要引入一些需要的头文件
  1. #include #include
复制代码
现在我们创建一个全局的播放器变量
  1. QMediaPlayer *player = new QMediaPlayer();
复制代码
然后编写刚刚的按钮槽函数
  1. void MainWindow::on_pushButton_set_clicked(){    player->setMedia(QMediaContent(QUrl::fromLocalFile("C:/Users/Administrator/Music/MV/test.mp4")));//这里的文件路径是本地的视频文件全路径 根据自己的情况来设置//player是刚刚建立的播放器变量    player->setVideoOutput(ui->widget_video);//widget_video是我们刚刚拖入的widget控件名称}
复制代码
做完这些后你的源文件.cpp看起来应该是这样的
112718nl5epsvnabj5d5ao.jpg 注意 这里的视频文件路径请根据你的视频存放位置填写 
如果你是从windows直接复制的路径 那么应该是\ 此时可能会跟C++的字符转义符\冲突 那么请在\前面再加上一个\ 或者将\改为/
  1. 直接复制路径:C:\Users\Administrator\Music\MV\test.mp4修改为:C:\\Users\\Administrator\\Music\\MV\\test.mp4或:C:/Users/Administrator/Music/MV/test.mp4
复制代码
7.同样照上述过程 编写第二个按钮的槽函数
回到.ui文件 右键第二个按钮 并选择"转到槽" 并选择clicked()
跳转到槽函数编写位置 写入以下内容:
  1. void MainWindow::on_pushButton_start_clicked(){    player->play();}
复制代码
最终完成的两个槽函数应该是这样的 112718x3rozrpuk6x6uxu3.jpg
8.编译运行
至此主要部分已经完成 我们编译运行软件看看效果如何
112718g449zxxzhb4o5hob.jpg
编译很顺利 没有Error 软件成功运行起来了 出现我们刚刚编辑的窗口
112719asy1096yg06jys16.jpg
至此基本播放功能实现完成 可以看到我下载到本地的MV已经播放出来了
9.踩坑提醒
点击开始播放没有反应并在Qt信息栏出现错误提示:DirectShowPlayerService::doRender: Unresolved error code 0x80040266
这是由于系统中不存在DirectShow解码器 因为Qt的视频播放控件是基于DirectShowPlayerService开发的
解决方案:安装一个DirectShow解码器 直接百度下载安装一个到系统 如:LAV Filters 重新编译运行
 
错误提示:DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()
解决方案:将视频文件放在全英文且无空格的路径下 修改路径后重新编译运行
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表