画像の配列からビデオを作成しようとしています。
ビデオを作成しましたが、プレゼンテーション時間に問題がありCMTime
ます。
次のコードを使用してビデオを作成しています
int frameCount = 1;
// Adding images here to buffer
for( int i = 0; i<[ fileArray count]; i++ )
{
// Create Pool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *imageTag = [fileArray objectAtIndex:i];
// Create file path
NSString *imgPath = [folderPath stringByAppendingPathComponent:imageTag];
// Get image
UIImage *img = [self getImageFromPath:imgPath];
buffer = [self pixelBufferFromCGImage:[img CGImage] size:size];
BOOL append_ok = NO;
int j = 0;
// Try 5 times if append failes
while ( !append_ok && j < 30 )
{
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
printf("appending %d attemp %d\n", frameCount, j);
NSTimeInterval duration = 7.0;
if ( [mArrAudioFileNames objectAtIndex:i] != [NSNull null] )
{
// Get Audio file
NSString *docsDir = [[self dataFolderPathForAudio]
stringByAppendingPathComponent:
[mArrAudioFileNames objectAtIndex:i]];
NSURL *soundFileURL = [NSURL fileURLWithPath:docsDir];
// Create AudioPlayer
NSError *error;
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:soundFileURL
error:&error];
// Get Audio duration
duration = [audioPlayer duration];
[audioPlayer release];
}
CMTime frameTime = CMTimeMake(frameCount,(int32_t)1);
append_ok = [adaptor appendPixelBuffer:buffer
withPresentationTime:frameTime];
[NSThread sleepForTimeInterval:0.05];
}
else
{
printf("adaptor not ready %d, %d\n", frameCount, j);
[NSThread sleepForTimeInterval:0.1];
}
j++;
}
if (!append_ok) {
printf("error appending image %d times %d\n", frameCount, j);
isError = YES;
}
frameCount++;
CVBufferRelease(buffer);
// drain the pool
[pool drain];
}
[videoWriterInput markAsFinished];
[videoWriter finishWriting];
[videoWriterInput release];
[videoWriter release];
配列に7つの画像がある場合、これにより7秒のビデオが作成されます。つまり、各画像が 1 秒間再生されます。
私の質問は、同じ画像セット (7 と仮定) でビデオを作成するにはどうすればよいですか? ビデオの各画像の表示時間が異なる場合です。
たとえば、ビデオの合計再生時間から最初の画像が 9 秒間再生された場合、2 番目の画像は 5 秒間、3 番目の画像は 20 秒間再生されます。
前もって感謝します。