2012-10-12 54 views
2

我想創建一個Mac應用程序供內部使用,即抓取用戶指定的電影文件,將其轉換爲特定的格式並將每個幀保存爲硬盤驅動器上的圖像。 我已經完成了轉換部分,使用真棒手剎CLI。視頻圖像序列與手剎CLI

現在我試圖找到一種方法來保存每一幀作爲圖像,但我找不到一種方法。

看來ffmpeg有一個命令將幀提取到圖像中。下面以拉一幀5秒:

ffmpeg -i "infile.mp4" -r 1 -ss 00:00:05 -t 00:00:01 -vframes 1 -f image2 -y "image.jpg" 

不過,我寧願使用QTKit或手剎CLI,所以我不會有兩個ffmpeg的和手剎添加到應用程序。

任何想法將不勝感激!

回答

1

所以,我已經確定你不能在Handbrake上討論過他們的IRC頻道。

然而,這裏與ffmpeg的做這件事的是一個相對簡單:

NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; 
outputPipe = [NSPipe pipe]; 
taskOutput = [outputPipe fileHandleForReading]; 
current_task = [[NSTask alloc] init]; 

NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; 

NSString *stillName = [NSString stringWithFormat:@"%@_still%d.png", [MY_FILE substringToIndex:([draggedFile length]-4)], MY_STILL_NUMBER]; 

[current_task setLaunchPath: [NSString stringWithFormat:@"%@/ffmpeg", resourcePath]]; 

// save just frame at current time 
// by leaving -ss before the -i, we enable direct indexing within ffmpeg, which saves a still in about a second, rather than a minute or so on a long video file 
NSArray *arguments = [NSArray arrayWithObjects:@"-ss", currentFrameTime, @"-i", draggedFile, @"-vframes", @"1", @"-f", @"image2", stillName, nil]; 

[current_task setArguments:arguments]; 
[current_task setStandardInput:[NSPipe pipe]]; 
[current_task setStandardOutput:outputPipe]; 
[current_task setStandardError:outputPipe]; 

[defaultCenter addObserver:self selector:@selector(saveTaskCompleted:) name:NSTaskDidTerminateNotification object:current_task]; 

[current_task launch]; 
[taskOutput readInBackgroundAndNotify]; 

所以,我使用手剎任務(轉換視頻),然後另一個任務保存靜態。 我只能使用ffmpeg,但我喜歡Handbrake,所以我會利用這2種方法。

希望這可以幫助那裏的任何人。

0

試試這個(按幀的數量在您的視頻替換25秒)

ffmpeg -i infile.mp4 -r 25 -f image2 /tmp/image-%4d.jpg 

然後用NSTask從您xcode項目運行此命令

Download FFMPEG O.11.1 for mac osx

Download FFMPEG git version for mac osx

+1

不知道你有什麼我問的嗎?我說我可以用ffmpeg來做,但是想用Handbrake(因爲我已經在使用視頻轉換)或QTKit來找到一種方法。有任何想法嗎? :) – Andre