簡體   English   中英

FFMpeg iOS應用程序中的音頻/視頻不同步

[英]FFMpeg Out of sync audio/video in iOS application

該應用程序將相機輸出保存為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);

你可以研究這個樣本: 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);
  }

在切換AVAssetWriters時我遇到了類似的問題,並注意到當我獲得視頻樣本時我才開始使用新的AVAssetWriter

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM