FFMpeg Вне синхронизации аудио/видео в приложении iOS
Приложение сохраняет вывод камеры в mov. файл, а затем переведите его в формат flv, отправленный AVPacket на сервер rtmp.
Он переключается каждый раз между двумя файлами, один записывается выходом камеры, а другой отправляется.
Моя проблема заключается в том, что через некоторое время аудио/видео перестает синхронизироваться.
Первый отправленный буфер - это всегда 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