Здравствуйте. Добрался таки до этого детища.
Вроде было все заамечательно но возникли вопросы которые не получается решить самостоятельно.
Касательно чтения.
Вот такой код сваял:
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 возвращает ноль. Следовательно я понимаю что кадр нашелся. Далее я хочу продолжить чтение файла с этой позиции, но файл читается дальше как будто он прочитал именно этот кадр и потом вернулся к своей исходной позиции.
Как мне правильно переместить позицию файла??
Касательно записи и кодирования файла.
Хочу кодировать в формате h264
Но почему то он не находит этого енкодера. Почему?? Как это проверить то и включить??
в сети пишут что нужно сделать av_register_all или avcodec_register_all(). Но этих функций нету в апи. Как так то??
Свежий билд беру вот отсюда.
В описании вроде утверждают что все собрано с поддержкой этих кодеков. К тому же декодирование нормально работает из этого формата.
После записи файла почему то не работает промотка в стандартных проигрывателях. Пример взят с официального ресурса
Когда такая же беда была в h264 мне пришлось участить вставку опорных кадров, только тогда получился нормальный результат. А тут то как быть?
Так не питон у меня. По мне так это костыли какие то … Да и собственно вопрос больше во вторых двух пунктах. С чтением я вроде бы разобрался. Как писать файл с правильными параметрами …
Ну разве это не костыль?? А как же гибкость использования …
К тому же каким образом завершить запись?7 Ведь там нужно вписать заголовок в начало файла …
А сами пробовали??
А по поводу h264 я так понял что это какой то не очень открытый формат … и в коммерческом софте его вроде как нельзя так просто использовать. И в сборках ffmpeg для лицензий lgpl и gpl он никогда не собирается…
Судя по коду, просто закрыть stdin. (CloseHandleв винапи)
хз костыль или нет, но многие так используют ffmpeg. Если программа предоставляет все возможности для этого, то почему б нет. Консольный интерфейс же и предназначен в т.ч. для автоматизации.