Как правильно расставить PTS/DTS (FFMPEG C++), в коде что ниже.. Сборка видеофайла из нескольких клипов
Таким образом я делаю один видеофайл из нескольких нарезанных клипов. Просто переставляя не раскодированные пакеты из однотипных файлов в один файл. Я здесь не очень хорошо понимаю относительно меток - dts pts. Вот так работало на ffmpeg 20го года. На ffmpeg 23го года, программа просто крашиться (вылетает) в цикле, без всяких сообщений.
AVPacket pkt;
while (1) {// << ======================= ЦИКЛ
av_init_packet(&pkt);
/* Установите данные и размер пакета так, чтобы он распознавался как пустой. */
pkt.data = NULL;
pkt.size = 0;
/* Установите данные и размер пакета так, чтобы он распознавался как пустой. */
if (av_read_frame(in_fmt_ctx, &pkt) < 0) break;
AVStream *in_stream = in_fmt_ctx->streams[pkt.stream_index];
AVStream *out_stream = out_fmt_ctx->streams[pkt.stream_index];
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
// Математически операция эквивалентна a * bq / cq.
pkt.pos = -1;
if (pkt.stream_index == video_stream_idx){
vid_next_pts += pkt.duration;
pkt.pts = vid_next_pts;
pkt.dts = vid_next_pts;
ret = av_interleaved_write_frame(out_fmt_ctx, &pkt);// ПИСАТЬ видео
if (ret < 0) {
printf("%s", "Error muxing packet\n"); end_exit = true; break;
}
}
else if(pkt.stream_index == audio_stream_idx) {
aud_smp_count += pkt.duration;
pkt.pts = aud_smp_count;
pkt.dts = aud_smp_count;
ret = av_interleaved_write_frame(out_fmt_ctx, &pkt);// ПИСАТЬ аудио <<< ===== и прочее
if (ret < 0) {
printf("%s", "Error muxing packet\n"); end_exit = true; break;
}
}
av_packet_unref(&pkt);
}// ========================== конец выполнения