如何在FFMPEG / C ++中同步音频和视频

时间:2016-07-04 18:05:45

标签: c++ audio video ffmpeg

我正在接收2个流(音频和视频),其中包含来自我网络中其他PC的时间戳。 我能够将视频和音频录制到分离的文件(mp4和aac),没有任何问题。 现在我试图将2个流放在一个mp4文件中,我创建了2个队列,一个用于音频数据包,另一个用于视频数据包,并试图像这样同步它们:

void * muxer(void * param) {
    QPair<AVPacket, unsigned long long int> completePacketAudio;
    QPair<AVPacket, unsigned long long int> completePacketVideo;
    AVPacket pkt;
    int vts = 0;
    int ats = 0;
    while(threadMuxRun) {
        contextMutex.lock(); 
        if(audioPacketQueue.isEmpty() && videoPacketQueue.isEmpty()) {
            contextMutex.unlock();
            Sleep(0);
            continue;
        } else if(audioPacketQueue.isEmpty()) {
            completePacketVideo = videoPacketQueue.head();
            pkt = videoPacketQueue.dequeue().first;
            pkt.pts = vts;
            vts++;
            std::cout << "video ts:" << pkt.pts << std::endl;
            av_packet_rescale_ts(&pkt, video_st.st->time_base, video_st.enc->time_base);            
        } else if(videoPacketQueue.isEmpty()) {
            completePacketAudio = audioPacketQueue.head();
            pkt = audioPacketQueue.dequeue().first;
            pkt.pts = ats;
            ats++;
            std::cout << "audio ts:" << pkt.pts << std::endl;
            av_packet_rescale_ts(&pkt, audio_st.st->time_base, audio_st.enc->time_base);
        } else {
            completePacketAudio = audioPacketQueue.head();
            completePacketVideo = videoPacketQueue.head();
            if(completePacketVideo.second < completePacketAudio.second) 
            {
                pkt = completePacketVideo.first;
                pkt.pts = vts;
                vts++;
                videoPacketQueue.dequeue();
                std::cout << "video ts:" << pkt.pts << std::endl;
                av_packet_rescale_ts(&pkt, video_st.st->time_base, video_st.enc->time_base);
            } else {
                audioPacketQueue.dequeue();
                pkt = completePacketAudio.first;
                pkt.pts = ats;
                ats++;
                std::cout << "audio ts:" << pkt.pts << std::endl;
                av_packet_rescale_ts(&pkt, audio_st.st->time_base, audio_st.enc->time_base);
            }
        }
        av_interleaved_write_frame(outputContext, &pkt);
        av_free_packet(&pkt);
        contextMutex.unlock();

    }

    return NULL;
}

我的视频比音频快10%左右,音频时间正确(我录制2分钟时有2分钟,但视频只有1:48)。

如果有人可以提示,请提前谢谢。

0 个答案:

没有答案