整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html多页面实现背景音乐的连续播放,简单处理笔记

在多个HTML页面之间切换时持续播放背景音乐,可以使用JavaScript和localStorage来实现。这里有一个简单的实现方案:

  1. 创建一个隐藏的音频播放器: 在每个HTML页面的<body>标签内添加一个隐藏的音频标签,并设置自动播放和循环播放属性。
  1. 使用JavaScript控制音频状态: 当页面加载时,检查localStorage中是否有音乐正在播放的状态,如果有,则恢复播放。同时,当页面离开时,记录音乐的播放状态到localStorage。

下面是一个简化版的多页面背景音乐连续播放的Demo示例。这个例子包含两个HTML文件:index.html 和 page2.html。请确保你有相应的音频文件(如music.mp3)并放置在与HTML文件相同的目录下。

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>首页</title>
        <style>
            #backgroundMusic {
                display: none;
            }
        </style>
    </head>
    <body>
        <h1>首页</h1>
        <p>这是首页,背景音乐会持续播放。</p>
        <a href="page2.html">前往第二页</a>

        <audio controls id="backgroundMusic" loop>
            <source src="https://img.mtsws.cn/LightPicture/2023/08/45f935a39d0189c0.mp3" type="audio/mpeg" />
            您的浏览器不支持 audio 元素。
        </audio>

        <script>
            document.addEventListener('DOMContentLoaded', function () {
                var audio = document.getElementById('backgroundMusic')
                setupMusic(audio)
            })

            function setupMusic(audio) {
                var musicTime = parseFloat(localStorage.getItem('musicTime')) || 0
                var isPlaying = localStorage.getItem('musicPlaying') === 'true'

                audio.currentTime = musicTime
                if (isPlaying) {
                    audio.play().catch(function (error) {
                        console.error('自动播放被阻止:', error)
                    })
                }

                audio.onplay = function () {
                    localStorage.setItem('musicPlaying', true)
                }
                audio.onpause = function () {
                    localStorage.setItem('musicPlaying', false)
                }
                audio.ontimeupdate = function () {
                    localStorage.setItem('musicTime', audio.currentTime)
                }
            }
        </script>
    </body>
</html>

page2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>第二页</title>
    <style>
        #backgroundMusic { display: none; }
    </style>
</head>
<body>

<h1>第二页</h1>
<p>切换到第二页,背景音乐仍然连续播放。</p>
<a href="index.html">返回首页</a>

<audio id="backgroundMusic" src="music.mp3" loop></audio>

<script>
    document.addEventListener('DOMContentLoaded', function() {
        var audio = document.getElementById('backgroundMusic');
        setupMusic(audio);
    });

    // 与index.html中相同的setupMusic函数,确保音乐播放逻辑一致
    function setupMusic(audio) {/*...函数内容与上文相同...*/}
</script>
</body>
</html>

在这个示例中,index.html 和 page2.html 都包含了相同的JavaScript逻辑来管理背景音乐的播放状态和时间。当用户在页面间导航时,音乐将会无缝继续播放,而不是重新开始。请根据实际需要调整音频文件路径和其他细节。

网页中添加视频、声音、动画等,可以增强用户体验。在HTML5之前,为网页添加多媒体的唯一办法,就是使用第三方的插件(如,Adobe Flash等)。

HTML5中,提供了对多媒体的原生支持,只需通过 video 元素,就可以向网页嵌入视频、电影或音频资源,通过 audio 元素向网页嵌入音频资源,省时省力。

HTML中嵌入视频和音频代码

一、视频

在HTML5时代,在网页中嵌入视频非常简单,只需要一个 video 元素,并设置它的 src 属性,使其链接一个视频地址就可以完全搞定了,这个太esay了

<video src="media/vedio.mp4"></video>

把这个网站在IE8中打开一看,网站上除了一片空白外,什么也没有,这是为什么呢?

原来 video 是HTML5最新引入的元素,并不是所有浏览器都支持它,IE8及以下版本都无法识别 video 标签。如果浏览器不识别 video标签,则会忽略它,当做什么都没有。这就是网站上一片空白的原因。

这个问题好解决,只需在 video 标签之间放置文本信息,不支持 video 标签的老浏览器,会显示 video 标签之间的文本信息,以提示用户浏览器不支持 video,就这么简单!

<video src="media/vedio.mp4">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在IE8上打开一看,确实显示了提示文本,这下好多了,至少用户知道自己的浏览器不能播放视频,该换浏览器了。

下载了Opera浏览器的最新版本25.0,打开一看,怎么还是一片空白外!Opera浏览器明明是支持video标签的,那又是为什么呢?

这个就得从视频的编码格式说起了。video 元素支持三种视频格式:Ogg、MP4、WebM。

Ogg是带有Theora视频编码和Vorbis音频编码的文件,后缀名为 .ogg;MP4是带有H.264视频编码和AAC音频编码的MP4文件,后缀名为 .mp4;WebM是VP8视频编码和Vorbis音频编码的文件,后缀名为 .webm。

这个Opera浏览器呢,它可以支持ogg,但不支持mp4。由于Opera支持video标签,故video标签之间的文本信息没有显示出来,但它不支持ogg,所以就不进行播放,最终导致页面出现一片空白。这下可怎么办呢?

其实办法有的是,我们可以从网上下载一副图像,放到视频播放窗口,如果视频无法播放,就显示这张图片,是不是更好呢?从网上下载一张美女图片,干脆叫beauty.jpg吧。那这个图像怎么添加到视频窗口呢?

video标签有个poster 属性,就是专门在视频窗口放置图片的。poster是一个video的占位符,无论什么情况下,只要视频还没有播放(视频下载过程中、视频不存在、不支持该视频类型、用户点击播放按钮前),就会显示该图像,可以看做是视频播放之前插入的宣传画或海报。

<video src="media/vedio.mp4" poster = "img/beauty.jpg">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在Opera浏览器上刷新一下,真的有一个美女冲着自己微笑呢。虽然视频没有播放出来,这回心情却是好多了。

那我可不能一天到晚只看美女呀,视频还是还是要想办法播放出来的。既然Opera浏览器不支持mp4,我们就换成需要ogg吧,这样就肯定没问题了。

我想了想,这个办法不好,万一某个浏览器只支持支持ogg,不支持mp4呢。这年头,什么都缺,就是不缺点子,随便在网上一搜,办法就有了。

在 video 元素中添加 source 元素,就可以解决这个问题。在source 元素中,通过 src 属性指定视频的地址,通过 type 属性指定视频的类型,以帮助浏览器决定是否能播放该视频。并且,在 video 元素中可以添加任意多个source 元素,让不同的 source 元素链接到不同的视频文件。

这样的话,当浏览器发现 video 元素时,首先会查看它本身是否定义了 src 属性。如果没有,就会检查 source 元素。浏览器会逐个查看这些视频源,直到找到一个可以播放的视频。一旦找到,就会播放它并忽略其他的视频源。我们干脆添加两个source,一个是mp4,一个是ogg,这下视频是一定能播放出来了。

<video poster = "img/beauty.jpg">

<source src="media/vedio.mp4" type="video/mp4">

<source src="media/vedio.ogg" type="video/ogg">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在Opera浏览器上又刷新一下,只有美女冲着我微笑,视频还是没播放出来。唉,太粗心了,忘记添加播放视频的控件了。

在video标签中,通过添加controls 属性来为视频添加播放控件,方便用户执行播放、暂停操作和音量控制。

<video poster = "img/beauty.jpg" controls>

(此处略去500字…)

</video>

在Opera浏览器上又刷新一下,效果真的不一样,这次不仅看到美女,还看到了视频控件。用鼠标猛戳一下那个播放按钮,哈哈,不错,真的听到美妙的旋律。我们的ogg文件,终于播放出来了,让我们好好享受一下吧O(∩_∩)O。

听了一会,忽然一想,不对呀,我刚才点了播放按钮后,等了半天才听到声音。能不能我一点播放按钮,就立即播放呢?

原来视频也是需要下载缓存的,点击播放按钮后,首先缓存,然后才播放的。那能不能在页面加载的同时就缓存呢。这样,用户点击播放后,就不必等待了。

这当然可以,在video标签中,通过添加preload属性来为视频添加预加载功能,在页面加载的同时加载视频。

<video poster = "img/beauty.jpg" controls preload>

(此处略去500字…)

</video>

关于 preload 属性,稍微再啰嗦一点,就是可以把它设置为 metadata,让浏览器仅仅预加载视频的基本信息,如尺寸、时长、以及一些关键的帧。这样的话,在开始播放之前,浏览器可以提前计算视频的显示尺寸。

既然一切都OK了!让我们看看mp4是不是能正常播放。下载最新版的Google Chrome 38.0浏览器,打开网页,猛戳一下播放按钮。

等等~,等等~,不对,怎么只有声音没有画面,明明是mp4格式的文件呀?使用暴风影音试了一下,是有画面的呀!

辛辛苦苦又在网上搜了一番,花了整整586秒,终于找到了答案。mp4视频需要h.264编码格式才会有图像的。

找了一个 h.264 编码格式的 mp4 试了一下,不错,确实有图像了!看了半天,原来是一部老外的电影,叽里咕噜一阵,一句话也没听懂。那O(∩_∩)O~,能否提供中文字幕呢,这样就不必费老大劲去听了!

HTML5中,通过在video元素添加track元素为视频添加字幕。字幕文件有两种格式:WebVTT和TTML。WebVTT是Web视频文本轨迹(Web Video Text Track),是UTF-8编码格式的文本文件;TTML是时序文本标记语言(Timed Text Markup Language),是XML格式的文件。两种文件的具体格式,已经超出我们的讨论范围。

video元素支持添加多个track元素,不同的track元素链接到不同的字幕文件。用户可以在各个字幕间进行切换。

<video poster = "img/beauty.jpg" controls preload>

<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>

<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">

</video>

track元素中,src属性指定字幕文件的URL;srclang属性字幕文件的语言类型,若kind 属性值是 "subtitles" 时,该属性必需的;label 属性指定字幕标签,每个字幕元素必需设置一个唯一不重复的标签,切换字幕时,会显示标签的名称;kind指定字幕内容类型,只能是subtitles、captions、descriptions、chapters、metadata 之一;default属性指定是否是默认字幕,如果一个都没指定,将不会自动显示字幕。

除了字幕外,我还希望对视频进行过多的控制,比如让视频自动播放、循环播放、默认静音,以及视频窗口的尺寸等等,这些都能做到吗?

这已经不是什么事了,video 元素已经提供了相关属性,根据需要设置相应的属性就可以了。这些属性及含义见表 23:

HTML中嵌入视频和音频代码

哦,原来这么简单呀!那就到此为止吧,网页中嵌入视频的全部代码都在这里,就打包给你吧!

<video width="300" poster="img/beauty.jpg" controls preload autoplay loop muted>

<source src="media/vedio.mp4">

<source src="media/vedio.ogg">

<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>

<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

睁大眼睛一看,却只有7行代码。然而,就这区区7行代码,可把他折磨得够呛。

看着这一切都全部搞定,他仰望着天空,长长呼了一口气,显得是那么的放松,那么的惬意。此时,他闭上眼睛,在自己的梦幻世界里遨游!


二、音频

有了在网页中嵌入视频的经历,要在网页中嵌入音频,那简直就是小菜一碟了。只要把vedio元素换成 audio 元素,就全部搞定。

但需要了解的是,audio 所支持的音频格式只有Ogg Vorbis、mp3 和 wav。还要知道,由于音频没有画面,也就没有 width、height、poster 属性,而其他属性都支持,并且跟视频的含义相同。

网页中嵌入音频的代码如下:

<audio controls preload autoplay loop muted>

<source src="media/audio.mp3">

<source src="media/audio.wav">

<source src="media/audio.ogg">

你的浏览器已经老掉牙了,不支持audio,还不赶快使用现代浏览器O(∩_∩)O~!

</audio>

放内存中的音乐

    QFile read("./music/Nevada.mp3");
    if (!read.open(QIODevice::ReadOnly))
    {
        qDebug() << "文件打开失败,请重试~";
    }
    //下面用的对象,必须动态申请,不然构造函数执行完毕,局部变量内存会被释放
    QByteArray *data = new QByteArray(read.readAll());
    read.close();

    QBuffer *buffer = new QBuffer(data,this);
    if (!buffer->open(QIODevice::ReadWrite))
    {
        qDebug() << "buffer error";
    }
    //qDebug() << data;
    QMediaPlayer *player = new QMediaPlayer(this);
    player->setMedia(QMediaContent(),buffer);
    player->play();

播放内存中的视频

    QMediaPlayer *player = new QMediaPlayer(this);
    player->setMedia(QUrl("./music/MMD.mp4"));
    player->play();
​
    QVideoWidget* videowidget = new QVideoWidget(this);
    player->setVideoOutput(videowidget);

vs中如果提示编译器堆空间不足,则打开vcxproj工程文件,在PropertyGroup中添加如下代码

<PropertyGroup Label="Globals">
    <!-- 资源文件加载,防止编译器堆空间不足 -->
     <PreferredToolArchitecture>x64</PreferredToolArchitecture> 
</PropertyGroup>

【领QT开发教程学习资料,点击下方链接免费领取↓↓,先码住不迷路~】

点击→领取「链接」

音视频播放

播放音频

在Qt中,要想使计算机发出响声,最简单的方法是调用QApplication : : beep()静态函数。而Qt Multimedia模块中提供了多个类来实现不同层次的音频输入,输出和处理。

QSound

QSound类提供了播放.wav声音文件的方法。

Qt 提供了 GUI 应用程序中最常用的音频操作:异步播放声音文件。 使用静态 play() 函数最容易做到这一点:

 QSound::play("mysounds/bells.wav");

或者,首先从声音文件创建一个 QSound 对象,然后调用 play() 槽:

  QSound bells("mysounds/bells.wav");
  bells.play();

在这两种情况下,文件可能是本地文件或资源中的文件。

一旦创建了 QSound 对象,就可以查询它的 fileName() 和 loops() 总数(即声音播放的次数)。 可以使用 setLoops() 函数更改重复次数。 播放声音时,loopsRemaining() 函数返回剩余的重复次数。 使用 isFinished() 函数来确定声音是否播放完毕。

使用 QSound 对象播放的声音可能会比静态 play() 函数使用更多的内存,但它也可能播放得更快(取决于底层平台的音频设施)。

如果您需要更好地控制播放声音,请考虑 QSoundEffect 或 QAudioOutput 类。

Public Functions

QSound(const QString &filename, QObject *parent = nullptr)
virtual ~QSound()
QString fileName() const
bool isFinished() const
int loops() const
int loopsRemaining() const
void setLoops(int number)

Slots

void play()
void stop()

Static Public Members

void play(const QString &filename)

QSoundEffect

QSoundEffect类提供了一种播放低延迟声音效果的方法 。

这个类允许你以较低的延迟方式播放未压缩的音频文件(通常是WAV文件),并且适用于“反馈”类型的声音,以响应用户的动作(例如虚拟键盘声音,弹出对话框的正面或负面反馈,或游戏声音)。 如果低延迟不重要,可以考虑使用QMediaPlayer类,因为它支持更广泛的媒体格式,并且资源消耗更少。

看个例子:

QSoundEffect effect;
effect.setSource(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/video_call.wav"));
effect.setLoopCount(QSoundEffect::Infinite);
effect.setVolume(0.8f);
effect.play();

通常应该重用音效,这样可以提前完成所有解析和准备工作,并且只在必要时触发。 这有助于降低延迟音频播放。

class MyGame
{
public:
  MyGame(): m_videoCall(this)
  {
      m_videoCall.setSource(QUrl::fromLocalFile("video_call.wav"));
      m_videoCall.setVolume(0.25f);
​
      // Set up click handling etc.
      connect(clickSource, &QPushButton::clicked, &m_videoCall, &QSoundEffect::play);
  }
private:
  QSoundEffect m_videoCall;
}

由于QSoundEffect需要更多的资源来实现较低的延迟播放,平台可能会限制同时播放声音效果的数量。

【领QT开发教程学习资料,点击下方链接免费领取↓↓,先码住不迷路~】

点击→领取「链接」

Public Functions

  • 设置
//设置源(wav文件路径)
void setSource(const QUrl &url)
//设置循环次数  
void setLoopCount(int loopCount)
//设置静音
void setMuted(bool muted)
//设置音量0~1之间
void setVolume(qreal volume)
  • 判断
//音效是否加载完毕
bool isLoaded() const
//是否是静音    
bool isMuted() const
//是否正在播放    
bool isPlaying() const

Slots

void play() //播放
void stop() //停止

Signals

void categoryChanged()
void loadedChanged()
void loopCountChanged()
void loopsRemainingChanged()
void mutedChanged()
void playingChanged()
void sourceChanged()
void statusChanged()
void volumeChanged()

枚举

QSoundEffect::Status

枚举

描述

QSoundEffect::Null

未设置源或源为空。

QSoundEffect::Loading

SoundEffect 正在尝试加载源。

QSoundEffect::Ready

源已加载并准备好播放。

QSoundEffect::Error

运行过程中出现错误,例如加载源失败。

QMediaPlayer

QMediaPlayer类是一个高级媒体播放类。 它可以用来播放歌曲、电影和网络广播等内容。 要播放的内容被指定为QMediaContent对象,可以将其视为附加了附加信息的主要或规范URL。 当提供QMediaContent时,可以开始播放。

QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
player.setVolume(50);
player.play();

QVideoWidget可以与QMediaPlayer一起用于视频渲染,QMediaPlaylist用于访问播放列表功能。

QVideoWidget wid;
wid.show();
​
QMediaPlaylist playList;
playList.addMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
playList.addMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/干坤坤.mp4"));
​
QMediaPlayer player;
player.setPlaylist(&playList);
//player.setMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
player.setVolume(50);
playList.next();
player.setVideoOutput(&wid);
player.play();

Public Functions

//该值是当前媒体的总播放时间,以毫秒为单位。 该值可能在QMediaPlayer对象的生命周期中发生变化,并且可能在初始回放开始时不可用,请连接到durationChanged()信号来接收状态通知。  
qint64 duration() const
//将QVideoWidget视频输出附加到媒体播放器。  
void setVideoOutput(QVideoWidget *output)
void setVideoOutput(QGraphicsVideoItem *output)
void setVideoOutput(QAbstractVideoSurface *surface)  

Public Slots

//暂停播放当前源
void pause()    
//开始或恢复播放当前源    
void play()
//设置当前媒体源。 使用mediaStatusChanged()和error()信号,以便在加载媒体和加载过程中发生错误时得到通知      
void setMedia(const QMediaContent &media, QIODevice *stream = nullptr)
//设置静音    
void setMuted(bool muted)
//设置倍速播放
void setPlaybackRate(qreal rate)
//设置播放列表    
void setPlaylist(QMediaPlaylist *playlist)
//设置播放位置,以媒体开始后的毫秒数为单位。 位置的周期性变化将用信号positionChanged()表示,更新间隔可以用QMediaObject的方法setNotifyInterval()设置。    
void setPosition(qint64 position)
//此属性保存当前播放音量。  播放音量是线性缩放的,从0(静音)到100(全音量)。默认为100      
void setVolume(int volume)
//停止播放,并将播放位置重置到开始    
void stop()

Signals

//表示当前播放内容已更改为media。  
void currentMediaChanged(const QMediaContent &media)
//表示内容的持续时间已更改为持续时间,以毫秒表示。  
void durationChanged(qint64 duration)    
//产生了错误
void error(QMediaPlayer::Error error)
//表示媒体来源已转变为media。      
void mediaChanged(const QMediaContent &media)
//表示当前媒体的状态已经改变    
void mediaStatusChanged(QMediaPlayer::MediaStatus status)
//静音状态改变  
void mutedChanged(bool muted)
//播放速率改变
void playbackRateChanged(qreal rate)
//播放位置改变    
void positionChanged(qint64 position)
//表示播放器对象的状态已经改变。  
void stateChanged(QMediaPlayer::State state)
//音量改变
void volumeChanged(int volume)

枚举

(enum QMediaPlayer::Error)媒体播放器产生的具体错误。

枚举

描述

MediaPlayer::NoError

没有错误发生

QMediaPlayer::ResourceError

无法解析媒体源

QMediaPlayer::FormatError

媒体资源的格式不受(完全)支持。 重新播放是可能的,但没有音频或视频组件。

QMediaPlayer::NetworkError

网络错误

QMediaPlayer::AccessDeniedError

没有播放媒体资源的适当权限。

QMediaPlayer::ServiceMissingError

找不到有效的播放服务,无法继续播放。

(enum QMediaPlayer::Flag)播放标志。

枚举

描述

QMediaPlayer::LowLatency

该播放器预计将用于简单的音频格式,播放没有明显的延迟。 这种回放服务可以用于蜂鸣声、铃声等。

QMediaPlayer::StreamPlayback

该播放器预计将播放基于QIODevice的流。 如果传递给QMediaPlayer构造器,将选择支持流回放的服务。

QMediaPlayer::VideoSurface

期望播放器能够呈现为QAbstractVideoSurface输出。

(enum QMediaPlayer::MediaStatus)定义媒体播放器当前媒体的状态。

枚举

描述

QMediaPlayer::UnknownMediaStatus

无法确定媒体的状态。

QMediaPlayer::NoMedia

没有当前的媒体。 播放器处于停止状态。

QMediaPlayer::LoadingMedia

当前媒体正在加载中。 播放器可能处于任何状态。

QMediaPlayer::LoadedMedia

已加载当前媒体。 播放器处于停止状态。

QMediaPlayer::StalledMedia

由于缓冲不足或其他一些临时中断,当前媒体的播放已停止。 播放器处于PlayingState或PausedState

QMediaPlayer::BufferingMedia

播放器正在缓冲数据,但缓冲了足够的数据以供播放。 播放器处于PlayingState或PausedState。

QMediaPlayer::BufferedMedia

播放器已经完全缓冲了当前的媒体。 播放器处于PlayingState或PausedState。

QMediaPlayer::EndOfMedia

播放已经结束。 播放器处于停止状态。

QMediaPlayer::InvalidMedia

当前媒体无法播放。 播放器处于停止状态。

(enum QMediaPlayer::State)媒体播放器的当前状态。

枚举

描述

QMediaPlayer::StoppedState

播放停止状态

QMediaPlayer::PlayingState

播放进行状态

QMediaPlayer::PausedState

播放暂停状态

QMediaPlaylist

QMediaPlaylist类提供了要播放的媒体内容列表。

QMediaPlaylist旨在与其他媒体对象一起使用,如QMediaPlayer。

QMediaPlaylist允许访问服务固有的播放列表功能(如果可用的话),否则它提供本地内存播放列表实现。

  playlist = new QMediaPlaylist;
  playlist->addMedia(QUrl("http://example.com/movie1.mp4"));
  playlist->addMedia(QUrl("http://example.com/movie2.mp4"));
  playlist->addMedia(QUrl("http://example.com/movie3.mp4"));
  playlist->setCurrentIndex(1);
​
  player = new QMediaPlayer;
  player->setPlaylist(playlist);
​
  videoWidget = new QVideoWidget;
  player->setVideoOutput(videoWidget);
  videoWidget->show();
​
  player->play();

根据播放列表源代码的实现,大多数播放列表更改操作可以是异步的。

【领QT开发教程学习资料,点击下方链接免费领取↓↓,先码住不迷路~】

点击→领取「链接」

Public Functions

  • 构造与析构
QMediaPlaylist(QObject *parent = nullptr)
virtual ~QMediaPlaylist()
  • 添加/移除/清空媒体
bool addMedia(const QMediaContent &content)
bool addMedia(const QList<QMediaContent> &items)
    
bool insertMedia(int pos, const QMediaContent &content)
bool insertMedia(int pos, const QList<QMediaContent> &items)    
    
bool removeMedia(int pos)
bool removeMedia(int start, int end)

bool clear()
  • 保存/加载播放列表
bool save(const QUrl &location, const char *format = nullptr)
bool save(QIODevice *device, const char *format)

void load(const QNetworkRequest &request, const char *format = nullptr)
void load(const QUrl &location, const char *format = nullptr)
void load(QIODevice *device, const char *format = nullptr)
  • 获取播放内容
int currentIndex() const
QMediaContent currentMedia() const

QMediaContent media(int index) const
int nextIndex(int steps = 1) const 
int previousIndex(int steps = 1) const
    
int mediaCount() const
  • 操作播放列表
bool moveMedia(int from, int to)
void setPlaybackMode(QMediaPlaylist::PlaybackMode mode)
  • 其他
QMediaPlaylist::Error error() const
QString errorString() const
    
bool isEmpty() const
bool isReadOnly() const

slots

void next()
void previous()
void setCurrentIndex(int playlistPosition)
void shuffle()

signals

void currentIndexChanged(int position)
void currentMediaChanged(const QMediaContent &content)
void loadFailed()
void loaded()
void mediaAboutToBeInserted(int start, int end)
void mediaAboutToBeRemoved(int start, int end)
void mediaChanged(int start, int end)
void mediaInserted(int start, int end)
void mediaRemoved(int start, int end)
void playbackModeChanged(QMediaPlaylist::PlaybackMode mode)

枚举

(enum QMediaPlaylist::Error)QMediaPlaylist错误码。

枚举

描述

QMediaPlaylist::NoError

没有错误

QMediaPlaylist::FormatError

格式错误

QMediaPlaylist::FormatNotSupportedError

格式不支持

QMediaPlaylist::NetworkError

网络错误

QMediaPlaylist::AccessDeniedError

访问错误(拒绝访问)

(enum QMediaPlaylist::PlaybackMode)描述了播放列表中的播放顺序。

枚举

描述

QMediaPlaylist::CurrentItemOnce

单曲播放一次

QMediaPlaylist::CurrentItemInLoop

单曲循环

QMediaPlaylist::Sequential

顺序播放(列表播放完结束)

QMediaPlaylist::Loop

列表循环(列表播放完,从头开始继续播放)

QMediaPlaylist::Random

随机播放

QMediaContent

QMediaContent类提供对与媒体内容相关的资源的访问。

QMediaContent在多媒体框架内用作媒体内容的逻辑句柄。 一个QMediaContent对象包含一个QNetworkRequest,它提供了内容的URL。

非空QMediaContent将始终具有对通过request()方法可用的内容的引用。

另外,QMediaContent可以表示播放列表,并包含指向有效QMediaPlaylist对象的指针。 在这种情况下URL是可选的,可以是空的,也可以指向播放列表的URL。

Public Functions

QMediaContent(QMediaPlaylist *playlist, const QUrl &contentUrl = QUrl(), bool takeOwnership = false)
QMediaContent(const QMediaContent &other)
QMediaContent(const QNetworkRequest &request)
QMediaContent(const QUrl &url)
QMediaContent()
QMediaContent &operator=(const QMediaContent &other)
~QMediaContent()
bool isNull() const
QMediaPlaylist *playlist() const
QNetworkRequest request() const
bool operator!=(const QMediaContent &other) const
bool operator==(const QMediaContent &other) const

视频播放

QMediaPlayer

QMediaPlayer类可用来播放视频,只不过需要搭配专门的视频显示控件来使用。

  • 针对视频播放的函数
void setVideoOutput(QVideoWidget *output)
void setVideoOutput(QGraphicsVideoItem *output)
    
//当前媒体的视频是否可用,如果可用,可以使用QVideoWidget类来查看视频。
bool isVideoAvailable() const    

QVideoWidget

  • 需包含模块multimediawidgets

QVideoWidget类提供了一个小部件,用于呈现由媒体对象生成的视频。

将 QVideoWidget 附加到 QMediaObject 允许它显示该媒体对象的视频或图像输出。 QVideoWidget 通过在其构造函数中传递指向 QMediaObject 的指针附加到媒体对象,并通过销毁 QVideoWidget 来分离。

  player = new QMediaPlayer;
​
  playlist = new QMediaPlaylist(player);
  playlist->addMedia(QUrl("http://example.com/myclip1.mp4"));
  playlist->addMedia(QUrl("http://example.com/myclip2.mp4"));
​
  videoWidget = new QVideoWidget;
  player->setVideoOutput(videoWidget);
​
  videoWidget->show();
  playlist->setCurrentIndex(1);
  player->play();

注意:一次只能将一个显示输出附加到媒体对象。

Public Functions

QVideoWidget(QWidget *parent = nullptr)
virtual ~QVideoWidget()
    
Qt::AspectRatioMode aspectRatioMode() const
int brightness() const      //亮度
int contrast() const        //对比度
int hue() const             //色调
bool isFullScreen() const   //是否全屏
int saturation() const      //饱和度

Slots

//设置视频缩放时,宽度和高度的变化模式
void setAspectRatioMode(Qt::AspectRatioMode mode)
//调整显示视频的亮度。有效亮度值范围在 -100 到 100 之间,默认值为 0。    
void setBrightness(int brightness)
//调整显示的视频的对比度。有效对比度值范围在-100到100之间,默认值为0。     
void setContrast(int contrast)
//调整显示视频的色调。有效的色调值范围在 -100 到 100 之间,默认值为 0。    
void setHue(int hue)
//调整显示视频的饱和度。 有效的饱和度值范围在-100到100之间,默认值是0。
void setSaturation(int saturation)    
//设置窗口全屏显示    
void setFullScreen(bool fullScreen)

Signals

//亮度改变
void brightnessChanged(int brightness)
//对比度改变    
void contrastChanged(int contrast)
//是否全屏状态改变    
void fullScreenChanged(bool fullScreen)
//饱和度改变    
void saturationChanged(int saturation)
//色调改变    
void hueChanged(int hue)    

https://www.cnblogs.com/lxuechao/p/12677357.html

摄像机

QCameraInfo

QCameraInfo 类提供有关相机设备的一般信息。

QCameraInfo 允许您查询系统上当前可用的相机设备。

静态函数 defaultCamera() 和 availableCameras() 为您提供所有可用相机的列表。

此示例打印所有可用相机的名称:

 const QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
 for (const QCameraInfo &cameraInfo : cameras)
     qDebug() << cameraInfo.deviceName();

一个QCameraInfo可以用来构造一个QCamera。 下面的例子实例化所有可用相机设备中第一个相机设备QCamera:

  const QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
  camera = new QCamera(cameras.first());

你也可以使用QCameraInfo来获得一个相机设备的一般信息,例如描述,在系统上的物理位置,或相机传感器的方向。

 QCamera myCamera;
  QCameraInfo cameraInfo(myCamera);
​
  if (cameraInfo.position() == QCamera::FrontFace)
      qDebug() << "摄像头位于硬件系统的正面。";
  else if (cameraInfo.position() == QCamera::BackFace)
      qDebug() << "摄像头位于硬件系统的背面。";
​
  qDebug() << "相机传感器方向是 " << cameraInfo.orientation() << " 度.";

QCamera

QCamera类为系统摄像机设备提供接口。

QCamera可以与QCameraViewfinder一起使用,用于取景器显示,QMediaRecorder用于视频录制,QCameraImageCapture用于图像拍摄。

你可以使用QCameraInfo列出可用的相机并选择使用哪一个。

Public Functions

  • 设置捕获模式
QCamera::CaptureModes captureMode() const
void setCaptureMode(QCamera::CaptureModes mode)
  • 设置取景器
void setViewfinder(QVideoWidget *viewfinder)
void setViewfinder(QGraphicsVideoItem *viewfinder)

枚举

QCamera::CaptureMode

捕获模式

枚举

描述

QCamera::CaptureViewfinder

取景器模式,只是简单的显示

QCamera::CaptureStillImage

帧捕获模式,比如:拍照

QCamera::CaptureVideo

视频捕获模式,比如:录制视频