[已解决] MediaPlayer.setVolume设置声音大小失效问题

本文介绍了一种解决MediaPlayer音量设置无效的方法。通过调整代码中setVolume方法的调用位置,成功解决了声音过小的问题。同时提供了setVolume方法的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写一个很平常的音乐播放方法,发现声音很小,于是调用MediaPlayer.setVolume来设置声音,结果无效,代码如下:

 private static MediaPlayer m = null;

    public void play(Context context) {

        m = new MediaPlayer();
        m = MediaPlayer.create(context, R.raw.myMusic);
        m.setAudioStreamType(AudioManager.STREAM_MUSIC);
        m.setVolume(1f, 1f);
        m.start();        

        m.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer arg0) {
                m.release();
                Log.d("MediaPlayer:", "release");
            }
        });

查找到的解决方法是将setVolume方法放到play之后,如下:

        m = new MediaPlayer();
        m = MediaPlayer.create(context, R.raw.myMusic);
        m.setAudioStreamType(AudioManager.STREAM_MUSIC);
          m.start(); 
        m.setVolume(1f, 1f);

再次测试发现声音已经变大,问题解决

查看setVolume源码的注释:
public void setVolume(float leftVolume, float rightVolume)

/**
     * Sets the volume on this player.
     * This API is recommended for balancing the output of audio streams
     * within an application. Unless you are writing an application to
     * control user settings, this API should be used in preference to
     * {@link AudioManager#setStreamVolume(int, int, int)} which sets the volume of ALL streams of
     * a particular type. Note that the passed volume values are raw scalars in range 0.0 to 1.0.
     * UI controls should be scaled logarithmically.
     *
     * @param leftVolume left volume scalar
     * @param rightVolume right volume scalar
     */

其中的两个参数分别是左右声道声音大小,取值范围为0~1

#include "musicplayer.h"#include "ui_musicplayer.h" #include<QFileDialog> #include<QDirIterator> MusicPlayer::MusicPlayer(QWidget *parent) : QWidget(parent), ui(new Ui::MusicPlayer), m_listModel(new QStandardItemModel(this)), m_mediaPlayer(new QMediaPlayer(this)), // m_audioOutput(new QAudioOutput(this)) m_audioOutput (new QAudioOutput(QAudioFormat(),this)) ,m_mediaPlayer2(new QSoundEffect(this)), m_currentIndex(-1), m_volumePopup(nullptr), m_volumeSlider(nullptr), m_isVolumePopupVisible(false) { ui->setupUi(this); ui->musicListView->setModel(m_listModel); updateVolumePopupPosition(); // 加载图标资源 playIcon = QIcon("://resource//play.png"); pauseIcon = QIcon("://resource//play2.png"); ui->playBttn->setIcon(playIcon); m_volumePopup = new QWidget(this); m_volumePopup->setVisible(false); // 初始隐藏 m_volumePopup->setFixedSize(120, 30); // 滑块尺寸(可调整) QHBoxLayout *popupLayout = new QHBoxLayout(m_volumePopup); popupLayout->setContentsMargins(0,0,0,0); m_volumeSlider = new QSlider(Qt::Horizontal, m_volumePopup); m_volumeSlider->setRange(0, 100); m_volumeSlider->setValue(50); // 默认音量 50% popupLayout->addWidget(m_volumeSlider); // 定位:在音量按钮下方(动态计算位置) /*connect(ui->volumeButton, &QPushButton::clicked, this, &MusicPlayer::on_volumeButton_clicked);*/ connect(m_volumeSlider, &QSlider::valueChanged, this, &MusicPlayer::onVolumeSliderChanged); // 安装事件过滤器:点击滑块外区域,自动隐藏 m_volumePopup->installEventFilter(this); // 初始化音量图标 updateVolumeIcon(50); connect(m_mediaPlayer, &QMediaPlayer::stateChanged, this, &MusicPlayer::onPlaybackStateChanged); connect(m_mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, &MusicPlayer::onMediaStatusChanged); connect(m_mediaPlayer, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), this, &MusicPlayer::onError); // 连接按钮信号(假设UI中已有这些按钮) //connect(ui->playBttn, &QPushButton::clicked, this, &MusicPlayer::on_playBttn_clicked); connect(ui->nextBttn, &QPushButton::clicked, this, &MusicPlayer::on_nextBttn_clicked); connect(ui->prevBttn, &QPushButton::clicked, this, &MusicPlayer::on_prevBttn_clicked); } MusicPlayer::~MusicPlayer() { delete ui; } void MusicPlayer::on_openDirBttn_clicked() { //打开文件夹选择对话框 auto path = QFileDialog::getExistingDirectory(this,"选择文件夹","C:\\Users\\18021\\Desktop\\qthomework\\MusicPlayer\\resource\\music"); if(path.isEmpty()){ return; } //打开目录,读取里面的音乐文件 // QDirIterator it(path,QDir::Filter::NoDotAndDotDot | QDir::Filter::AllEntries); QDirIterator it(path,{"*.mp3","*.wav"},QDir::Files|QDir::NoDotAndDotDot);//过滤 while(it.hasNext()){ it.next(); auto info = it.fileInfo(); auto item =new QStandardItem(info.fileName()); //把音乐的完整路径存储起来 item->setData(info.canonicalFilePath(),Qt::UserRole); m_listModel->appendRow(item); } } void MusicPlayer::on_musicListView_doubleClicked(const QModelIndex &index) { m_currentIndex=index.row(); playCurrentIndex(); /* QString filePath = index.data(Qt::UserRole).toString(); qDebug() << "Selected file:" << filePath; // 检查文件是否存在 if (!QFile::exists(filePath)) { qWarning() << "文件不存在:" << filePath; return; } QUrl fileUrl = QUrl::fromLocalFile(filePath); if (!fileUrl.isValid()) { qWarning() << "无效 URL:" << fileUrl.toString(); return; } m_mediaPlayer->setMedia(QMediaContent(fileUrl)); m_mediaPlayer->play(); // 输出播放状态 qDebug() << "播放状态:" << m_mediaPlayer->state(); qDebug() << "媒体状态:" << m_mediaPlayer->mediaStatus();*/ } void MusicPlayer::on_nextBttn_clicked() { if (m_listModel->rowCount() <= 0) return; m_currentIndex = (m_currentIndex + 1) % m_listModel->rowCount(); playCurrentIndex(); } void MusicPlayer::playCurrentIndex() { if (m_currentIndex < 0 || m_currentIndex >= m_listModel->rowCount()) return; QModelIndex index = m_listModel->index(m_currentIndex, 0); QString filePath = index.data(Qt::UserRole).toString(); if (QFile::exists(filePath)) { QUrl fileUrl = QUrl::fromLocalFile(filePath); m_mediaPlayer->setMedia(QMediaContent(fileUrl)); m_mediaPlayer->play(); // 更新UI显示当前播放歌曲 ui->statusLabel->setText("播放中: " + QFileInfo(filePath).fileName()); ui->musicListView->setCurrentIndex(index); } updateButtonStates(); } void MusicPlayer::onPlaybackStateChanged(QMediaPlayer::State state) { updateButtonStates(); if (state == QMediaPlayer::PlayingState) { ui->playBttn->setIcon(pauseIcon); // 播放时显示暂停图标 } else { ui->playBttn->setIcon(playIcon); // 暂停/停止时显示播放图标 } } void MusicPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status) { qDebug() << "Media status changed:" << status; // 自动播放下一曲 if (status == QMediaPlayer::EndOfMedia && m_listModel->rowCount() > 0) { on_nextBttn_clicked(); } } void MusicPlayer::onError(QMediaPlayer::Error error) { qWarning() << "播放错误:" << m_mediaPlayer->errorString(); ui->statusLabel->setText("播放错误: " + m_mediaPlayer->errorString()); } void MusicPlayer::updateButtonStates() { bool hasMusic = m_listModel->rowCount() > 0; bool isPlaying = m_mediaPlayer->state() == QMediaPlayer::PlayingState; ui->playBttn->setEnabled(hasMusic); ui->nextBttn->setEnabled(hasMusic); ui->prevBttn->setEnabled(hasMusic); // 可以根据需要添加其他UI更新逻辑 } void MusicPlayer::on_playBttn_clicked() { // 打印当前状态,确认是否进入正确分支(调试用) qDebug() << "当前播放状态:" << m_mediaPlayer->state(); if (m_mediaPlayer->state() == QMediaPlayer::PlayingState) { // 若正在播放,调用pause() m_mediaPlayer->pause(); qDebug() << "已调用pause(),暂停播放"; // 确认是否执行到这里 } else { // 若暂停/停止,调用play() if (m_currentIndex >= 0 && m_currentIndex < m_listModel->rowCount()) { m_mediaPlayer->play(); qDebug() << "已调用play(),继续播放"; } else if (m_listModel->rowCount() > 0) { m_currentIndex = 0; playCurrentIndex(); } } } void MusicPlayer::on_prevBttn_clicked() { if (m_listModel->rowCount() <= 0) return; m_currentIndex = (m_currentIndex - 1 + m_listModel->rowCount()) % m_listModel->rowCount(); playCurrentIndex(); } void MusicPlayer::on_volumeButton_clicked() { qDebug() << "音量按钮被点击,当前可见状态:" << m_isVolumePopupVisible; // 点击时应输出 qDebug() << "滑块设置为可见:" << m_isVolumePopupVisible; // 应切换 true/false m_isVolumePopupVisible = !m_isVolumePopupVisible; m_volumePopup->setVisible(m_isVolumePopupVisible); // 如果显示,自动获取焦点(避免点击其他区域立即隐藏) if (m_isVolumePopupVisible) { m_volumePopup->setFocus(); } } // -------------------- // 滑块调节:同步更新音量 // -------------------- void MusicPlayer::onVolumeSliderChanged(int value) { m_audioOutput->setVolume(value / 1000.0); // 转换为 0.0~1.0 范围 updateVolumeIcon(value); // 更新音量图标 } // -------------------- // 音量图标切换(静音/低/高) // -------------------- void MusicPlayer::updateVolumeIcon(int volume) { ui->volumeButton->setIcon(QIcon("://resource//volumn.png")); // 高音量 } // -------------------- // 事件过滤器:点击滑块外区域,隐藏滑块 // -------------------- bool MusicPlayer::eventFilter(QObject *obj, QEvent *event) { if (obj == m_volumePopup && event->type() == QEvent::MouseButtonPress) { // 使用qobject_cast进行安全转换 QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent) { // 检查点击位置是否在滑块容器内 if (!m_volumePopup->geometry().contains(mouseEvent->globalPos())) { m_volumePopup->setVisible(false); m_isVolumePopupVisible = false; return true; // 拦截事件,避免传递 } } } return QWidget::eventFilter(obj, event); } // -------------------- // 可选:窗口resize时,保持滑块位置对齐音量按钮 // -------------------- void MusicPlayer::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); if (m_volumePopup) { QPoint buttonPos = ui->volumeButton->pos(); m_volumePopup->move( buttonPos.x(), buttonPos.y() + ui->volumeButton->height() + 5 ); } } void MusicPlayer::updateVolumePopupPosition() { if (!ui->volumeButton || !m_volumePopup) return; // 关键:将按钮的局部坐标转换为 **窗口(this)的全局坐标** QPoint buttonGlobalPos = ui->volumeButton->mapToGlobal(QPoint(0, 0)); // 再转换为窗口的局部坐标(因为弹窗父控件是窗口) QPoint buttonPosInWindow = mapFromGlobal(buttonGlobalPos); m_volumePopup->move( buttonPosInWindow.x(), // 与按钮同 X 轴 buttonPosInWindow.y() + ui->volumeButton->height() + 5 // 按钮下方 5px ); }这个音乐播放器有什么问题
最新发布
07-09
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游逸丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值