код на ObjC для OSX для извлеченя кадров из видео
Хотите добавить свое задание на разработку сайта, дизайна, интернет-магазина или прочей работы?
Нужно написать функции-обертки, который будет использован для извлечения всех кадров из видео, под Mac OS 10.7 и выше.
Нужно использовать AVFoundation (именно AVFoundation, QTKit & QuickTime не подходят!).
Код однопоточный, наше приложение с интерфейсом командной строки (то есть никакого GUI нет).
О том как читать кадры с видео см пример от Apple:
developer.apple.com/libra...
Файл Objective-CAVReaderWriterOSXAAPLDocument.m
Писать на Objective-C++ или Objective-C (но не на свифте!).
Нужно реализовать такие функции:
---------------------------
int setup_movie(char* fnm /* file name in utf8 */,
int maxwidth = 100 /* width of output picture */);
/*
Изоображения каждого извлеченного кадра должно иметь ширину maxwidth(а высоту вычислить исходя из пропорций видеоролика). Для этого у AVFoundation есть свойства, которые раз и навсегда указывают размер выходного изображения.
*/
double _get_framerate(); //frames per second, as double, e.g. 25
double _get_duration(); //duration in seconds, e.g. 12.4
void set_current_time(double attime); //go to time in seconds
void get_next_frame_image(frame_norm_t* outbuf); /* извлекает изображение следующего кадра в outbuf. В отладочном режиме оно также должно писать его в графический файл с именем "curimage" любого выбранного ВАМИ формата (png/jpg/bmp) в текущем каталоге. Это чтобы мы могли убедиться что ваш код действительно работает */
double _get_curtime(); //current time in seconds (for frame that will be read next in sequence)
void cleanup_movie();
void set_debug_mode(bool is_debug); /* см описание get_next_frame_image. */
-----------------------------
Содержимое кадров должно браться используя функцию generateCGImagesAsynchronouslyForTimes
- то есть надо организовать очередь из содержимых кадров, заполнять ее используя
generateCGImagesAsynchronouslyForTimes для 30 следующих кадров, и по мере поступающих вызовов
get_next_frame_image опустошать ее.
developer.apple.com/libra...
Пискелы должны браться в формате kCVPixelFormatType_32RGBA (в примере выше они берутся в формате
kCVPixelFormatType_32ARGB, просто замените константу в коде на kCVPixelFormatType_32RGBA).
Формат outbuf объясним выбранным исполнителям, в двух словах это просто массив из 32-битных
величин, под одной для каждого пиксела.
Наш код работает с одним видео за жизнь приложения, так что все состояние (например, все
указатели на структуры, описывающие видео), пусть храняться в глобальных переменных.
Наш код однопоточный, так что всякими синхронизациями, семафорами и мутексами можно не
заморачиваться.
То есть вот примерный код нашего приложения, и как он будет вызывать функции, которые вы должны реализовать:
setup_movie("/tmp/1.mp4");
//потом узнаем свойства видео, решает что делать
_get_framerate();
_get_duration();
//потом переходим к нужному нам времени
set_current_time(fromtime);
while (_get_curtime() < totime)
{
get_next_frame_image(buf); //далее в цикле перебираем все кадры как можно быстрее
}
cleanup_movie();
exit(0); // то есть setup_movie будет вызываться 1 раз за жизнь программы
Чтобы оставить свое предложение необходимо войти в систему!