Разборки FFMPEG

Здравствуйте. Добрался таки до этого детища.
Вроде было все заамечательно но возникли вопросы которые не получается решить самостоятельно.

  1. Касательно чтения.
    Вот такой код сваял:
int64_t FrameToPts(AVStream* pavStream, int frame)
{
	return (int64_t(frame) * pavStream->r_frame_rate.den * pavStream->time_base.den) / (int64_t(pavStream->r_frame_rate.num) * pavStream->time_base.num);
}

/*
AVSEEK_FLAG_BACKWARD < seek backward
AVSEEK_FLAG_BYTE     < seeking based on position in bytes
AVSEEK_FLAG_ANY      < seek to any frame, even non-keyframes
AVSEEK_FLAG_FRAME    < seeking based on frame number
*/
int VideoFileReader::SeekPosition(int FrameIdx, int  iSeekFlag = AVSEEK_FLAG_ANY)
{
	int ret = -1;
	if (VideoStream)
	{
		int64_t iSeekTarget = FrameToPts(VideoStream, max(0, FrameIdx));
		ret = av_seek_frame(FormatContext, video_stream_idx, iSeekTarget, iSeekFlag);
	}
	return ret;
}

Функция SeekPosition возвращает ноль. Следовательно я понимаю что кадр нашелся. Далее я хочу продолжить чтение файла с этой позиции, но файл читается дальше как будто он прочитал именно этот кадр и потом вернулся к своей исходной позиции.
Как мне правильно переместить позицию файла??

  1. Касательно записи и кодирования файла.
    Хочу кодировать в формате h264
	const char* nm = avcodec_get_name(AVCodecID::AV_CODEC_ID_H264);
	codec = avcodec_find_encoder_by_name(nm);

Но почему то он не находит этого енкодера. Почему?? Как это проверить то и включить??

в сети пишут что нужно сделать av_register_all или avcodec_register_all(). Но этих функций нету в апи. Как так то??

Свежий билд беру вот отсюда.
В описании вроде утверждают что все собрано с поддержкой этих кодеков. К тому же декодирование нормально работает из этого формата.

  1. После записи файла почему то не работает промотка в стандартных проигрывателях. Пример взят с официального ресурса

Когда такая же беда была в h264 мне пришлось участить вставку опорных кадров, только тогда получился нормальный результат. А тут то как быть?

Вот поэтому многие просто вызывают программу ffmpeg ))

Они вроде бы не нужны уже
https://github.com/leandromoreira/ffmpeg-libav-tutorial/issues/29#issuecomment-404939213

Так а как с этим работать то?? Как мне управлять процессом сбора данных??
открыл файл и читаю покадрово … я же колбэк не передам в программу …

Кадры можно просто в файлы извлечь. Или

Так не питон у меня. По мне так это костыли какие то … Да и собственно вопрос больше во вторых двух пунктах. С чтением я вроде бы разобрался. Как писать файл с правильными параметрами …

Так при чем тут что у тебя.
Вспомни OpenCV.
Там все построено на покадровом чтении.
Просто для кадра выделяй переменную отдельную (промежуточную).

Че?? это пост ради поста?? О чем вы говорите то?

Там пример записи вроде простой для любого языка, просто в stdin процесса ffmpeg писать кадры в определенном формате.

strings of the form “RGBRGBRGB…” where R,G,B are characters that represent a number between 0 and 255.

Ну разве это не костыль?? А как же гибкость использования …
К тому же каким образом завершить запись?7 Ведь там нужно вписать заголовок в начало файла …

А сами пробовали??

А по поводу h264 я так понял что это какой то не очень открытый формат … и в коммерческом софте его вроде как нельзя так просто использовать. И в сборках ffmpeg для лицензий lgpl и gpl он никогда не собирается…

Судя по коду, просто закрыть stdin. (CloseHandle в винапи)

хз костыль или нет, но многие так используют ffmpeg. Если программа предоставляет все возможности для этого, то почему б нет. Консольный интерфейс же и предназначен в т.ч. для автоматизации.

Обертка для дотнета так же делает.

ну … ради прикола попробовал через командную строку слить данные в файл.

ffmpeg -y -f vfwcap -r 25 -i 0 -vcodec libx264 out.mp4

Буквально пару минут, получил файлик на 20 метров который абсолютно ни каким плеером не читается.

ЗЫ: В общем разобрался…

ffmpeg -f dshow -i video="PC Camera" -vcodec libx264 -preset veryslow -tune film -r 30 out.mp4

Вроде работает пишет все… но чет как то не впечатляет механизм. Превьюшки нету …

А где ей быть?)

Если генерировать кадры своим приложением, то конечно можно их и показывать, а не только писать в файл.

“открытый” != “бесплатный”

Да, там в некоторых случаях надо платить, надо разбираться.
MP4 / h.264 patent issues? - Video Production Stack Exchange

С openh264 наверно не надо.
Ну и если ПО просто использует ffmpeg не распространяя его с собой, то наверно тоже всё ок.

А где разница?? ПО распространяется конечно … в инсталятор зашит ffmpeg… Как его можно использовать не распространяя?

Попросить отдельно установить если еще нет в системе.

Вообще может лучше просто использовать например AV1 вместо х264.

Так а пользователь откажется и ПО будет неработоспособно …
Поэтмоу пока для записи пользую OpenH264