m0_61770108 2024-07-12 09:27 采纳率: 13.5%
浏览 8
已结题

Qt6中播放解码音频QByteArray报错handleSourceError: 0x8007007B

Qt6中播放解码音频QByteArray报错handleSourceError: 0x8007007B
Qt6中播放解码音频QByteArray报错handleSourceError: 0x8007007B
源码:

mediaPlayer = new QMediaPlayer();
    output = new QAudioOutput();
    mediaPlayer->setAudioOutput(output);

    mediaPlayer->play();

while (av_read_frame(pFormatCtx, packet) >= 0) {
        if (packet->stream_index == audioStream) {
            if(avcodec_send_packet(pCodecCtx, packet) == 0){
                while (avcodec_receive_frame(pCodecCtx, pFrame) >= 0) {

                    int outNbSamples = swr_get_out_samples(swr_ctx2, pFrame->nb_samples);

                    av_samples_alloc((uint8_t **)&pFramePCM->data, &pFramePCM->linesize[0],pCodecCtx->ch_layout.nb_channels, outNbSamples,AV_SAMPLE_FMT_S16, 1);

                    swr_convert(swr_ctx2, pFramePCM->data, outNbSamples,(const uint8_t **)pFrame->data, pFrame->nb_samples);


                    int totalSize = pFrame->nb_samples * pCodecCtx->ch_layout.nb_channels * outNbSamples;
                    QByteArray audioData((char *)pFramePCM->data[0], outNbSamples * (pFrame->ch_layout.nb_channels+2));

                    mediaPlayer->setSource(QUrl(audioData.data()));
                    //playPcmData(audioData);
                    //QByteArray audioData((char *)pFramePCM->data, pFramePCM->nb_samples * pCodecCtx->ch_layout.nb_channels * 3);

                    //streamOut->write(audioData.data(),audioData.size());
                    //buffer->setBuffer(&audioData);
                    //buffer->open(QBuffer::ReadWrite);
                }
            }
        }
        av_packet_unref(packet);
    }
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-12 09:27
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好!看起来您在 Qt6 中使用 QMediaPlayerQAudioOutput 来播放解码后的音频时遇到了一些问题。我会尝试帮助您分析代码中可能存在的问题。

    1. QMediaPlayer 和 QAudioOutput 的设置和使用

      • 您的代码中创建了 QMediaPlayerQAudioOutput 的实例,并且将 QAudioOutput 设置为 QMediaPlayer 的音频输出。这部分看起来是正确的。
    2. 音频解码流程

      • 您使用了 FFmpeg 库中的 av_read_frameavcodec_send_packetavcodec_receive_frame 来解码音频数据。这些函数的使用看起来是正确的,但需要注意确保 avcodec_send_packetavcodec_receive_frame 能够正确接收解码后的帧。
    3. 音频数据转换为 QByteArray 格式

      • 您的代码中使用 av_samples_allocswr_convert 来将解码后的音频帧转换为 PCM 数据,然后尝试将这些数据包装成 QByteArray
      • 这里可能存在问题,QByteArray 的大小计算可能不正确。您使用的是 outNbSamples * (pFrame->ch_layout.nb_channels+2),但通常我们只需要 outNbSamples * pCodecCtx->ch_layout.nb_channels * 2(假设样本格式是 16 位的)。
    4. mediaPlayer 的 setSource 方法调用

      • setSource 方法通常是用来设置媒体源的 URL。您这里使用 QByteArray 作为数据源,这可能不是 setSource 方法所期望的用法。通常,QMediaPlayer 需要一个有效的 URL 来播放媒体。您可能需要使用 QBuffer 来将解码后的音频数据传递给 QMediaPlayer
    5. 音频数据是否能够正确播放

      • 由于 setSource 方法调用可能不正确,音频数据可能无法正确播放。您需要确保音频数据以正确的方式传递给 QMediaPlayer

    建议

    • 检查 QByteArray 的大小计算是否正确。
    • 考虑使用 QBuffer 来包装解码后的音频数据,并将其设置为 QMediaPlayer 的源。
    • 确保所有 FFmpeg 相关的函数调用都正确执行,并且没有内存泄漏或其他错误。

    由于我没有实际运行您的代码,以上只是基于代码片段的分析。如果需要更详细的帮助,您可以提供更多的上下文信息,或者尝试在 Qt 社区或相关论坛上寻求帮助。

    至于参考链接,由于我不能提供实时的网络搜索结果,您可能需要自行搜索 Qt6、QMediaPlayer、QAudioOutput 以及 FFmpeg 的相关文档和论坛讨论。希望这些建议对您有所帮助!

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月2日
  • 创建了问题 7月12日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错