C ++ FFmpeg, как продолжить кодирование после сброса? - PullRequest
0 голосов
/ 26 октября 2018

Пишу полученные пакеты в двоичных файлах. Когда запись первого файла завершена, я вызываю flush:

avcodec_send_frame(context, NULL);

Это сигнал окончания потока. Но когда я отправляю новый кадр в кодировщик, функция возвращает AVERROR_EOF (man: кодировщик сброшен, и новые кадры не могут быть отправлены на него) . Что нужно сделать, чтобы кодировщик взял кадры после очистки?

Пример: при декодировании вы можете позвонить:

avcodec_flush_buffers(context);

Эта функция изменяет поток, но только для декодирования. Может быть, аналоговая функция для кодирования?

Идеи:

1) не вызывать флеш. Но кодер буферизует кадры внутри и выдает некоторые пакеты только после сброса (используя h.264 с b-кадрами) , тогда как некоторые пакеты попадают в следующий файл.

2) Восстановить контекст кодека?

Подробности: использовать Win 7, Qt 5.10, ffmpeg 4.0.2

1 Ответ

0 голосов
/ 26 октября 2018

Правильный ответ: вы должны создать новый контекст кодека для каждого файла, иначе возникнет головная боль. Небольшой расход дополнительных заголовков и ключевых кадров должен быть небольшим, если вы не делаете что-то очень экзотическое.

B-кадры могут относиться как к предыдущим, так и к будущим кадрам, как бы вы решили выбрать такого зверя?

Теоретически вы, вероятно, могли бы форсировать ключевой кадр и надеяться на лучшее, но тогда действительно нет никакого смысла не запускать новый контекст, если только сотни или около того байтов начальных данных H264 не являются проблемой.

...