gpt4 book ai didi

c++ - FFMPEG API - 录制视频和音频 - 同步问题

转载 作者:行者123 更新时间:2023-12-03 02:00:54 65 4
gpt4 key购买 nike

我正在开发一个能够从网络摄像头录制视频和从麦克风录制音频的应用程序。我一直在使用 QT,但不幸的是相机模块在 Windows 上不起作用,这导致我使用 ffmpeg 来录制视频/音频。

我的相机模块现在运行良好,除了同步的小问题。音频和视频有时会因微小的差异而不同步(我会说不到 1 秒,尽管较长的录音可能会更糟)。

当我对帧进行编码时,我按以下方式添加 PTS(我取自 muxing.c 示例):

  • 对于视频帧,我将 PTS 逐一递增(从 0 开始)。
  • 对于音频帧,我将 PTS 增加 nb_samples音频帧(从 0 开始)。

  • 我以 25 fps 的速度保存文件并要求相机给我 25 fps(它可以)。我还将视频帧转换为 YUV420P格式。对于音频帧转换,我需要使用 AVAudioFifo因为 microfone 发送的样本比 mp4 流支持的更大,所以我必须将它们分成 block 。我用了 transcode.c例如。

    我不知道应该做什么来同步音频和视频。我是否需要使用时钟或其他东西来正确同步两个流?

    完整代码太大,无法在此处发布,但如果有必要,我可以将其添加到 github,例如。

    这是编写框架的代码:
    int FFCapture::writeFrame(const AVRational *time_base, AVStream *stream, AVPacket *pkt) {
    /* rescale output packet timestamp values from codec to stream timebase */
    av_packet_rescale_ts(pkt, *time_base, stream->time_base);
    pkt->stream_index = stream->index;
    /* Write the compressed frame to the media file. */
    return av_interleaved_write_frame(oFormatContext, pkt);
    }

    获取耗时的代码:
    qint64 FFCapture::getElapsedTime(qint64 *previousTime) {
    qint64 newTime = timer.elapsed();
    if(newTime > *previousTime) {
    *previousTime = newTime;
    return newTime;
    }
    return -1;
    }

    添加PTS的代码(分别为视频和音频流):
    qint64 time = getElapsedTime(&previousVideoTime);
    if(time >= 0) outFrame->pts = time;
    //if(time >= 0) outFrame->pts = av_rescale_q(time, outStream.videoStream->codec->time_base, outStream.videoStream->time_base);

    qint64 time = getElapsedTime(&previousAudioTime);
    if(time >= 0) {
    AVRational aux;
    aux.num = 1;
    aux.den = 1000;
    outFrame->pts = time;
    //outFrame->pts = av_rescale_q(time, aux, outStream.audioStream->time_base);
    }

    最佳答案

    听起来您需要为帧(音频和视频)提供真正的时间戳。创建一个函数,返回自开始捕获以来耗时(以毫秒为单位)(整数)。然后设置time_base对于每个流到 {1,1000}并设置pts每一帧到你的函数的返回值。但要小心:你不能有一个 <= 前一个时间戳的时间戳。因此,如果您一次获得多个帧,则需要丢帧(或编写另一种机制来处理这种情况)。

    取自我更长的答案here .

    使用 QElapsedTimer 的示例here .

    关于c++ - FFMPEG API - 录制视频和音频 - 同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31617598/

    65 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com