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

Posted

技术标签:

【中文标题】iOS应用程序中的FFMpeg音频/视频不同步【英文标题】:FFMpeg Out of sync audio/video in iOS application 【发布时间】:2012-11-09 18:26:12 【问题描述】:

应用程序将相机输出保存到 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);

【问题讨论】:

【参考方案1】:

你可以研究这个样本:http://unick-soft.ru/art/files/ffmpegEncoder-vs2008.zip

但此示例适用于 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);
  

【讨论】:

【参考方案2】:

我在切换 AVAssetWriters 时遇到了类似的问题,并注意到如果我只在获得视频样本时才开始使用新的 AVAssetWriter 就会出现问题

https://medium.com/@brandon.kobel/ios-seamless-video-chunks-4383a5a3a874

【讨论】:

以上是关于iOS应用程序中的FFMpeg音频/视频不同步的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg学习6:视音频同步

FFMPEG 将 image2pipe 中的视频与 RTMP 中的音频同步

FFmpeg C API - 同步视频和音频

音视频同步

与 ffmpeg 的音视频同步

ffmpeg音频和视频同步错误