我正在接收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)。
如果有人可以提示,请提前谢谢。