Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

[super viewDidAppear: animated];

static BOOL beenHereBefore = NO;

if (beenHereBefore){

/* Отображаем элемент для выбора даты только после того, как вызывается

метод viewDidAppear:, что происходит при каждом отображении вида

нашего контроллера вида */

return;

} else {

beenHereBefore = YES;

}

self.assetsLibrary = [[ALAssetsLibrary alloc] init];

dispatch_queue_t dispatchQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(dispatchQueue, ^(void) {

[self.assetsLibrary

enumerateGroupsWithTypes: ALAssetsGroupAll

usingBlock: ^(ALAssetsGroup *group, BOOL *stop) {

__block BOOL foundTheVideo = NO;

[group enumerateAssetsUsingBlock: ^(ALAsset *result,

NSUInteger index,

BOOL *stop) {

/* Получаем
тип ресурса. */

NSString *assetType = [result

valueForProperty: ALAssetPropertyType];

if ([assetType isEqualToString: ALAssetTypeVideo]){

NSLog(@"This is a video asset");

foundTheVideo = YES;

*stop = YES;

/* Получаем объект представления ресурса. */

ALAssetRepresentation *assetRepresentation =

[result defaultRepresentation];

const NSUInteger BufferSize = 1024;

uint8_t buffer[BufferSize];

NSUInteger bytesRead = 0;

long long currentOffset = 0;

NSError *readingError = nil;

/* Создаем путь, по которому должно быть сохранено видео. */

NSString *videoPath = [documentsFolder

stringByAppendingPathComponent:@"Temp.MOV"];

NSFileManager *fileManager = [[NSFileManager alloc] init];

/* Создаем файл, если он еще не существует. */

if ([fileManager fileExistsAtPath: videoPath] == NO){

[fileManager createFileAtPath: videoPath

contents: nil

attributes: nil];

}

/* Этот дескриптор файла мы будем использовать для записи

медийных ресурсов на диск. */

NSFileHandle *fileHandle = [NSFileHandle

fileHandleForWritingAtPath: videoPath];

do{

/* Считываем
столько байтов, сколько можем поместить в буфер. */

bytesRead = [assetRepresentation getBytes:(uint8_t *)&buffer

fromOffset: currentOffset

length: BufferSize

error:&readingError];

/* Если ничего считать не можем, то выходим из этого цикла. */

if (bytesRead == 0){

break;

}

/* Данные о смещении буфера должны быть актуальными. */

currentOffset += bytesRead;

/* Помещаем буфер в объект NSData. */

NSData *readData = [[NSData alloc]

initWithBytes:(const void *)buffer

length: bytesRead];

/* И записываем данные в файл. */

[fileHandle writeData: readData];

} while (bytesRead > 0);

NSLog(@"Finished reading and storing the \

video in the documents folder");

}

}];

if (foundTheVideo){

*stop = YES;

}

}

failureBlock: ^(NSError *error) {

NSLog(@"Failed to enumerate the asset groups.");

}];

});

}

Вот что происходит в данном коде.

1. Мы получаем стандартное представление первого видеоресурса, который находим в библиотеке ресурсов.

2. Создаем файл Temp.MOV в каталоге Documents нашего приложения для сохранения содержимого видеоресурса.

3. Создаем цикл, работающий до тех пор, пока в представлении ресурса еще остаются данные, которые необходимо считать. Метод экземпляра getBytes: fromOffset: length: error:, относящийся к объекту представления ресурса, считывает столько байтов, сколько может поместиться в буфер, и проделывает это столько раз, сколько необходимо, пока мы не достигнем конца данных представления.

4. После считывания данных в буфер мы заключаем их в объект типа NSData, используя для этого метод инициализации initWithBytes: length: класса NSData. Затем записываем эти данные в файл, созданный ранее, с помощью метода экземпляра writeData:, относящегося к классу NSFileHandle.

13.8. Редактирование видео на устройстве с операционной системой iOS

Постановка задачи

Требуется, чтобы пользователь, просматривающий видео, мог редактировать видео в этом же приложении.

Поделиться:
Популярные книги

На гребне обстоятельств

Шелег Дмитрий Витальевич
7. Живой лед
Фантастика:
фэнтези
5.25
рейтинг книги
На гребне обстоятельств

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Черный Маг Императора 16

Герда Александр
16. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 16

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Император Пограничья 7

Астахов Евгений Евгеньевич
7. Император Пограничья
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Император Пограничья 7

Зодчий. Книга III

Погуляй Юрий Александрович
3. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга III

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Законы Рода. Том 2

Андрей Мельник
2. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 2

Одинаковые. Том 3. Индокитай

Алмазный Петр
3. Братья Горские
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Одинаковые. Том 3. Индокитай