Я хочу сохранить видеопоток h264, полученный от источника RTSP, в контейнер MP4. В отличие от других вопросов, задаваемых по SO, здесь возникают следующие проблемы:
Вот код, который я сделал
// ffmpeg
pkt->data = ..;
pkt->size = ..;
pkt->flags = bKeyFrame? AV_PKT_FLAG_KEY : 0;
pkt->dts = AV_NOPTS_VALUE;
pkt->pts = PTS;
// PTS is based on epoch microseconds so I ignored re-scaling.
//av_packet_rescale_ts(pkt, { 1, AV_TIME_BASE }, muxTimebase);
auto ret = av_interleaved_write_frame(m_pAVFormatCtx, pkt);
Я получил много сообщений об ошибках, таких как: «Приложение предоставило недопустимые, немонотонно увеличивающие dts для muxer ...».
Результат: файл mp4 воспроизводится через VL C, но FPS просто половина исходного FPS и продолжительность видео неверна (VL C показывает странное число).
Так как мне установить правильные DTS и PTS перед отправкой в контейнер?
Обновление: Я попробовал некоторые изменения, но пока не удалось, я обнаружил, что причина падения частоты кадров заключается в том, что мультиплексор сбрасывает кадры с неправильным DTS. Кроме того, если я установил слишком большое значение начала PTS и DTS, некоторым игрокам, таким как VL C, придется подождать некоторое время, прежде чем показывать видео.