avcodec на C, замороженное изображение

105
7

Я пишу видеопакеты из видеопотока в буфер. и затем я пытаюсь записать их в файл.

            av_init_packet( &pkt );
int bufer_size=250;

while ( av_read_frame( ifcx, &pkt ) >= 0 && start_flag==0 && stop_flag==0){
printf("reading packet - %i \n", pkg_index);
if ( pkt.stream_index == i_index ) {
pkt.stream_index = ost->id;
pkt.pts = av_rescale_q_rnd(pkt.pts, ist->time_base, ost->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
pkt.dts = av_rescale_q_rnd(pkt.dts, ist->time_base, ost->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
pkt.duration = av_rescale_q(pkt.duration, ist->time_base, ost->time_base);
pkt.pos = -1;
av_copy_packet(&pkt_arr[pkg_index],&pkt);
}
av_free_packet( &pkt );
av_init_packet( &pkt );
pkg_index++;

if(pkg_index>=bufer_size){

int ret = avformat_write_header(ofcx, NULL);
av_dump_format( ofcx, 0, ofcx->filename, 1 );

int i;
int start_frame=0;
for(i=start_frame; i<bufer_size; i++){
av_interleaved_write_frame( ofcx, &pkt_arr[i] );
}

av_write_trailer( ofcx );
avio_close( ofcx->pb );
printf("END \n");
return 0;

}
}

теперь проблема: если start_frame = 0 everithing в порядке, у меня есть 10-секундный видеофайл. Но если start_frame = 125 (например) в resault, у меня есть видеофайл с 5-секундным замороженным изображением и 5-секундным видео.

что случилось?

также в конце у меня есть ошибки:

[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 1
[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 2
[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 3
[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 4
[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 5
[avi @ 0x287a9f0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= 6

может быть, вы знаете, что это такое.

спросил(а) 2021-01-19T16:38:23+03:00 2 месяца, 3 недели назад
1
Решение
139

Как бы то ни было, вы должны повторно настроить пакет pts/dts для смены кадра +125. Попробуйте перезагрузить pts/dts перед av_interleaved_write_frame. Для pts эта простая формула может работать pkt.pts = frame_count * pkt.duration. dts сложнее, но для теста puspose try pkt.dts = pkt.pts. Надеюсь, это поможет.

ответил(а) 2021-01-19T16:38:23+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема