m0_61770108 2024-07-11 11:44 采纳率: 13.5%
浏览 6
已结题

Qt5.12+FFmpeg7中将AAC转为PCM,再将AVFrame中的data转为QByteArray,写入到QIODevice,再用QAudioOutput播出

Qt5.12+FFmpeg7中将AAC转为PCM,再将AVFrame中的data转为QByteArray,写入到QIODevice,再用QAudioOutput播出
问题:没有任何声音输出
源码如下:

    swr_alloc_set_opts2(&swr_ctx2,out_ch_layout, AV_SAMPLE_FMT_S16, out_codec_ctx->sample_rate,in_ch_layout, pCodecCtx->sample_fmt, pCodecCtx->sample_rate,0, NULL);
    swr_init(swr_ctx2);

    packet = av_packet_alloc();

    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);

                    QByteArray audioData = convertAvFrameToQByteArray(pFramePCM);

                    streamOut->write(audioData.data(),audioData.size());

                    qDebug()<<"接收到了音频";
                }
            }
        }
        av_packet_unref(packet);
    }

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-11 11:44
    关注

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


    您好,看起来您正在使用 FFmpeg 和 Qt 来处理音频数据。您遇到的问题可能涉及多个方面,以下是一些可能的检查点和建议:

    1. 确保 AAC 到 PCM 的转换过程是正确的

      • 检查 swr_alloc_set_opts2swr_init 是否正确设置了转换参数。
      • 确保 out_ch_layoutin_ch_layout 正确表示了输出和输入的声道布局。
    2. 确保 AVFrame 数据正确转换为 QByteArray

      • 您需要确保 convertAvFrameToQByteArray 函数正确地将 AVFrame 中的数据转换为 QByteArray。这个函数的实现没有在代码中显示,所以需要检查这个函数是否正确处理了数据的复制和转换。
    3. 确保数据正确写入 QIODevice

      • 检查 streamOut->write 是否返回了预期的写入字节数。如果返回值小于 audioData.size(),可能意味着写入不完整。
    4. 确保 QAudioOutput 能够正确播放音频数据

      • 检查 QAudioOutput 的初始化和配置是否正确,包括音频格式、缓冲区大小等。
      • 确保音频数据流已经正确地传递给 QAudioOutput,并且 QAudioOutput 已经启动播放。
    5. 其他可能的问题

      • 检查音频流是否在正确的流索引上。
      • 确保 avcodec_send_packetavcodec_receive_frame 在循环中正确使用,并且没有遗漏任何必要的步骤。
      • 检查是否有任何内存泄漏或资源未正确释放的问题。
    6. 调试建议

      • 使用调试输出来跟踪代码的执行流程和关键变量的值。
      • 如果可能,使用一个已知的音频播放器来测试转换后的 PCM 数据,以确保数据本身没有问题。
    7. 参考链接

    请注意,这些只是基于您提供的代码片段和描述的一些建议。实际问题可能需要更详细的调试和分析。如果您需要进一步的帮助,可以提供更多的上下文信息,例如 convertAvFrameToQByteArray 函数的实现,以及 QAudioOutput 的配置和初始化代码。

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥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报错