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

ЖАНРЫ

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

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

Шрифт:

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

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

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

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

Решение

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

Обсуждение

Класс UIVideoEditorController,

содержащийся в iOS SDK, позволяет программисту вывести на экран перед пользователем специальный интерфейс для редактирования. Все, что требуется сделать, — предоставить URL видеоролика, который предполагается отредактировать, а потом отобразить в модальном виде контроллер для редактирования видео. Не допускайте наложения вида этого контроллера на любые другие виды и не изменяйте этот вид.

При вызове метода presentModalViewController: animated: сразу же после метода dismissModalViewControllerAnimated: контроллера вида приложение завершится с ошибкой времени исполнения. Необходимо дождаться, пока первый контроллер вида не будет убран с экрана, и только потом отображать второй контроллер вида. Можно пользоваться относящимся к контроллерам вида методом viewDidAppear:, помогающим определить, когда отобразится ваш вид. На данном этапе можно быть уверенным, что все модальные контроллеры видов уже убраны.

Итак, продолжим и объявим контроллер вида со всеми необходимыми свойствами:

#import «ViewController.h»

#import <MobileCoreServices/MobileCoreServices.h>

#import <AssetsLibrary/AssetsLibrary.h>

@interface ViewController 

<UINavigationControllerDelegate,

UIVideoEditorControllerDelegate,

UIImagePickerControllerDelegate>

@property (nonatomic, strong) NSURL *videoURLToEdit;

@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary;

@end

@implementation ViewController

<# Остаток вашего кода находится здесь #>

Далее нужно обработать различные сообщения, получаемые от делегата видеоредактора в контроллере вида:

— (void)videoEditorController:(UIVideoEditorController *)editor

didSaveEditedVideoToPath:(NSString *)editedVideoPath{

NSLog(@"The video editor finished saving video");

NSLog(@"The edited video path is at = %@", editedVideoPath);

[editor dismissModalViewControllerAnimated: YES];

}

— (void)videoEditorController:(UIVideoEditorController *)editor

didFailWithError:(NSError *)error{

NSLog(@"Video editor error occurred = %@", error);

[editor dismissModalViewControllerAnimated: YES];

}

— (void)videoEditorControllerDidCancel:(UIVideoEditorController *)editor{

NSLog(@"The video editor was cancelled");

[editor dismissModalViewControllerAnimated: YES];

}

Когда вид загрузится, мы должны будем отобразить для пользователя вид для выбора видео. Видео он может выбрать из библиотеки, а потом мы предоставим возможность его обрабатывать:

Поделиться с друзьями: