2010-07-08 5 views
1

Так как создать то, что будет иметь что-то подобное в его апи:Как создать функцию для FFmpeg lib для кодирования кадра в любой (возможный) формат?

Encoder = EncoderFormat(format name); // prepare encoder 
//...code for frames generation... now we want to encode frame!// 
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, more args if needed); 

возможно ли это? Может ли кто-нибудь дать простой пример того, как создать такую ​​вещь?

ответ

1

Это невозможно, не прибегая к чрезвычайно плохим практикам программирования, таким как глобальные переменные. Кодирование фреймов не является независимым; кодер должен сохранять состояние (контекст), для которого вы должны постоянно указывать указатель на функцию кодера. Идея передачи выбора формата EncodeFrame также довольно глупа, так как вы не можете выбрать формат для каждого кадра без закрытия существующего контекста кодировщика и перехода на новый.

Если исходное изображение уже находится в формате, который требует кодировщик (возможно, YUV 4: 2: 0), вам понадобится его конвертер. Это можно сделать самостоятельно или с помощью libswscale из ffmpeg. Вам также нужно предоставить временную метку для каждого фрейма. Если вам нужен простой API, где вам не нужно беспокоиться об этом, вы, вероятно, захотите обернуть указатель контекста av-кодека libavcodec, который даст вам другую структуру, в которой вы сохраните текущее значение временной метки, указатель контекста swscale и т. Д.

Кроме того, ваш API не имеет возможности указывать размер целевого буфера, поэтому он абсолютно небезопасен. Лучше вернуть указатель на внутренний буфер (через возвращаемое значение или аргумент указателя на указатель) вместе с размером кодированного кадра вместо записи в буфер вызывающего.

+0

В общем, когда я попросил такую ​​апи, я расскажу о некоторой абстракции (обобщении) о том, как бы я хотел ее увидеть. Такой «простой» API будет небезопасным. И это нормально для меня, потому что я не собираюсь делать какую-то супер-крутую программу реального мира - мне просто нужен простой инструмент для кодирования кадров, которые я создаю (создание кадров - это то, что действительно интересно для меня) ... Итак, моя точка зрения - если это небезопасно, или плохая практика - хорошо - дайте ему шанс! конечно, если он сокрушит ПК, я не буду счастлив, но если он сделает свой куб, я буду счастлив, имея свой прототип. – Rella