14

アプリはカメラ出力をmovに保存します。ファイルを変換し、AVPacket によって rtmp サーバーに送信される flv 形式に変換します。2 つのファイルを毎回切り替えます。1 つはカメラ出力によって書き込まれ、もう 1 つは送信されます。私の問題は、オーディオ/ビデオがしばらくすると同期しなくなることです。

送信される最初のバッファは常に 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);
4

2 に答える 2

0

このサンプルを調べることができます: 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);
  }
于 2013-01-10T22:55:03.527 に答える
0

AVAssetWriter を切り替えたときに同様の問題が発生しましたが、ビデオ サンプルを取得したときに新しい AVAssetWriter を使い始めただけで問題が解決したことに気付きました。

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

于 2016-07-28T19:58:54.887 に答える