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
Постановка задачи
Требуется, чтобы пользователь, просматривающий видео, мог редактировать видео в этом же приложении.
Решение
Воспользуйтесь классом UIVideoEditorController. В приведенном здесь примере используем данный класс вместе с контроллером для выбора изображений. Сначала мы предлагаем пользователю выбрать снимок из его библиотеки фотографий. После того как выбор будет сделан, отображаем экземпляр контроллера видеоредактора, где пользователь может обрабатывать выбранное видео.
Обсуждение
Класс UIVideoEditorController, содержащийся в iOS SDK, позволяет программисту вывести на экран перед пользователем специальный интерфейс для редактирования. Все, что требуется сделать, — предоставить URL видеоролика, который предполагается отредактировать, а потом отобразить в модальном виде контроллер для редактирования видео. Не допускайте наложения вида этого контроллера на любые другие виды и не изменяйте этот вид.
При вызове метода presentModalViewController: animated: сразу же после метода dismissModalViewControllerAnimated: контроллера вида приложение завершится с ошибкой времени исполнения. Необходимо дождаться, пока первый контроллер вида не будет убран с экрана, и только потом отображать второй контроллер вида. Можно пользоваться относящимся к контроллерам вида методом viewDidAppear:, помогающим определить, когда отобразится ваш вид. На данном этапе можно быть уверенным, что все модальные контроллеры видов уже убраны.
Итак, продолжим и объявим контроллер вида со всеми необходимыми свойствами:
#import «ViewController.h»
#import
#import
@interface ViewController ()
UIVideoEditorControllerDelegate,
UIImagePickerControllerDelegate>
@property (nonatomic, strong) NSURL *videoURLToEdit;
@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary;