Каков наилучший способ вернуть изображение или видеофайл из функции с использованием c ++? - PullRequest
0 голосов
/ 06 марта 2012

Я пишу библиотеку c ++, которая выбирает и возвращает либо данные изображений, либо видеоданные с облачного сервера с использованием libcurl.Я начал писать тестовый код, но все еще застрял в разработке API, потому что я не уверен, как лучше всего обрабатывать эти медиа-файлы.Хранение в переменной типа char / string в виде двоичных данных, кажется, работает, но мне интересно, занимало бы это слишком много оперативной памяти, если файлы слишком велики.Я новичок в этом, поэтому, пожалуйста, предложите решение.

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Если вы беспокоитесь о том, что делать, кодируйте как для возврата данных в массиве, так и для записи данных в файл ... и передайте ответственность за выбор вызывающей стороне. Сделайте вашу функцию что-то вроде

/* one of dst and outfile should be NULL */
/* if dst is not NULL, dstlen specifies the size of the array */
/* if outfile is not NULL, data is written to that file */
/* the return value indicates success (0) or reason for failure */
int getdata(unsigned char *dst, size_t dstlen,
            const char *outfile,
            const char *resource);
0 голосов
/ 06 марта 2012

Вы можете использовать что-то вроде zlib, чтобы сжать его в памяти, а затем распаковать его только тогда, когда это необходимо; тем не менее, большинство современных компьютеров имеют достаточно много памяти, поэтому вы можете обрабатывать довольно много изображений, прежде чем начать сжатие. С видео, которые фактически являются МНОЖЕСТВОМ изображений, это становится немного более важным - вы склонны к распаковке по ходу работы и, возможно, даже к потоковому воспроизведению с диска.

Обычный способ справиться с этим, с точки зрения API, состоит в том, чтобы иметь что-то вроде объекта Image и объекта Video (классов). Эти объекты будут иметь функции для «получения» несжатого изображения / кадра. Функция «get» проверит, сжаты ли данные в данный момент; если это так, он распаковывает его перед возвратом; если он не сжат, он может вернуть его немедленно. То, как данные на самом деле хранятся (сжатые / несжатые / на диске / в памяти), и детали работы с ними, таким образом, скрыты за функцией «get». Самое главное, эта модель позволяет вам позже передумать, добавив дополнительные типы сжатия, добавив поддержку потоковой передачи на диск и т. Д., Не изменяя способ написания кода, вызывающего функцию get ().

Другая проблема заключается в том, как вы возвращаете объект Image или Video из функции. Вы можете сделать это так:

Image getImageFromURL( const std::string &url );

Но есть интересная проблема, что изображение «копируется» во время процесса возврата (иногда зависит от того, как компилятор оптимизирует вещи). Этот способ более эффективно использует память:

void getImageFromURL( const std::string &url, Image &result );

Таким образом, вы передаете объект изображения, в который хотите загрузить свое изображение. Копии не сделаны. Вы также можете изменить возвращаемое значение 'void' на какой-либо код ошибки / состояния, если вы не используете исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...