Objective c iOS应用程序中的FFMpeg不同步音频/视频

Objective c iOS应用程序中的FFMpeg不同步音频/视频,objective-c,ios,c,ffmpeg,avfoundation,Objective C,Ios,C,Ffmpeg,Avfoundation,应用程序将相机输出保存到mov中。文件,然后将其转换为AVPacket发送到rtmp服务器的flv格式。 它每次在两个文件之间切换,一个由相机输出写入,另一个发送。 我的问题是音频/视频在一段时间后变得不同步 发送的第一个缓冲区始终是100%同步的,但过了一段时间它就会变得混乱。 我相信这是DTS-PTS的问题 if(isVideo) { packet->stream_index = VIDEO_STREAM; packet->dts = packet->pts

应用程序将相机输出保存到mov中。文件,然后将其转换为AVPacket发送到rtmp服务器的flv格式。 它每次在两个文件之间切换,一个由相机输出写入,另一个发送。 我的问题是音频/视频在一段时间后变得不同步

发送的第一个缓冲区始终是100%同步的,但过了一段时间它就会变得混乱。 我相信这是DTS-PTS的问题

 if(isVideo)
{
    packet->stream_index = VIDEO_STREAM;
   packet->dts = packet->pts = videoPosition;
    videoPosition += packet->duration = FLV_TIMEBASE * packet->duration * videoCodec->ticks_per_frame * videoCodec->time_base.num / videoCodec->time_base.den;

}
else
{
    packet->stream_index = AUDIO_STREAM;
    packet->dts = packet->pts = audioPosition;
    audioPosition += packet->duration = FLV_TIMEBASE * packet->duration / audioRate;

   //NSLog(@"audio position = %lld", audioPosition);
}

packet->pos = -1;
packet->convergence_duration = AV_NOPTS_VALUE;

// This sometimes fails without being a critical error, so no exception is raised
if((code = av_interleaved_write_frame(file, packet)))
{
    NSLog(@"Streamer::Couldn't write frame");
}
av_free_packet(packet);

您可以研究此示例:

但此示例适用于Windows

在此示例中,我仅将pts用于音频流:

  if (pVideoCodec->coded_frame->pts != AV_NOPTS_VALUE)
  {
    pkt.pts = av_rescale_q(pVideoCodec->coded_frame->pts, 
      pVideoCodec->time_base, pVideoStream->time_base);
  }

当我关掉AVAssetWriter时,我也遇到了类似的问题,我注意到如果我在收到一个视频样本后才开始使用新的AVAssetWriter,情况就会大有改观