iOS 4: качество видео с помощью приложения на базе AVAsset - PullRequest
2 голосов
/ 20 февраля 2011

Я пытаюсь создать простое видео-приложение (загрузить существующий видеофайл с устройства ios 4, отредактировать его с помощью прямого пиксельного доступа и сохранить под другим именем).

Мне удалось загрузить, отредактировать и сохранить файл фильма на реальном устройстве (ipod 4g).Единственная проблема, которая у меня возникла, связана с качеством фильма (оригинал или отредактированный).Я не знаю, что я делаю не так, но качество выходного файла очень плохое по сравнению с входным.

Ниже вы можете узнать, как я загружаю свой фильм:

// // *** tmp file ***
NSURL *movieUrl = [info objectForKey:@"UIImagePickerControllerMediaURL"];
NSLog(@"picker controller movie url: %@", [movieUrl absoluteString]);
## picker controller movie url: /private/var/mobile/Applications/6253D1-8C0-41-B780-638250817/tmp//trim.2q03uz.MOV
AVURLAsset *movieAsset = [[AVURLAsset alloc] initWithURL:movieUrl options:nil]; 
CGSize size = [movieAsset naturalSize];  
NSLog(@"movie asset natual size: size.width = %f size.height = %f", size.width, size.height);
## movie asset natual size: size.width = 224.000000 size.height = 128.000000

// *** ASSET READER ***
AVAssetReader *assetReader = [[AVAssetReader alloc] initWithAsset:movieAsset error:&error]; 
NSArray* videoTracks = [movieAsset tracksWithMediaType:AVMediaTypeVideo]; 
// asset track
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0];   
NSDictionary* dictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] 
                            forKey:(id)kCVPixelBufferPixelFormatTypeKey];
NSLog(@"video track %f %f %d", [videoTrack naturalSize].width, [videoTrack naturalSize].height, [videoTrack nominalFrameRate]);
## video track 224.000000 128.000000 0
/*
also tried
 kCVPixelFormatType_32BGRA
 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
*/
// asset reader track output
AVAssetReaderTrackOutput* assetReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack 
                                                outputSettings:dictionary];
if(![assetReader canAddOutput:assetReaderOutput])
    NSLog(@"unable to add reader output");
else 
    [assetReader addOutput:assetReaderOutput];

// *** ASSET WRITER ***
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:exportURL
                                fileType:AVFileTypeQuickTimeMovie error:&error];
NSParameterAssert(videoWriter);
NSLog(@"asset writer %d %d", [videoWriter status], [error code]);

NSDictionary *videoCompressionProps = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithDouble:128.0*1024.0], AVVideoAverageBitRateKey,
                                      nil];

NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                               AVVideoCodecH264, AVVideoCodecKey,
                               [NSNumber numberWithInt:size.width], AVVideoWidthKey,
                               [NSNumber numberWithInt:size.height], AVVideoHeightKey,
                               //videoCompressionProps, AVVideoCompressionPropertiesKey,<- no difference at all
                               nil];

AVAssetWriterInput* writerInput = [[AVAssetWriterInput
                                    assetWriterInputWithMediaType:AVMediaTypeVideo
                                    outputSettings:videoSettings] retain];

// set preffered transform for output video
writerInput.transform = [videoTrack preferredTransform];

NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];

writerInput.expectsMediaDataInRealTime = NO;

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

Пожалуйста, ребята, дайте мне несколько советов: -).

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Попробуйте установить:

imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

до выбора фильма.

1 голос
/ 25 февраля 2011

Похоже, вы используете UIImagePickerController.Я полагаю, что это сожмет ваше видео, что приведет к плохому качеству, которое вы получаете.

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

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