Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/128-605a9038

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

QuickTime Movieの縦横を入れ替えてみる。

MOVの縦横を入れ替えてみる。

大きな流れとして、
・ファイルからQTMovieを作る。(qtmとする)
・空のQTMovieを作成する。(newMovieとする)
・サウンドトラックをqtmからnewMovieに移植する。
・newMovieにqtmのサイズで空のトラックを作る。
・追加したトラックの縦横アトリビュートを入れ替える。
・qtmから各フレームのイメージを取り出し、縦横入れ替えて追加したトラックに追加していく。
・newMovieを書き出す。

空のトラックを追加するところは、以下ページを参考にした。
http://developer.apple.com/jp/technotes/tn2004/tn2138.html#TNTAG3
しかし、このままではコンパイルが通らないので、(OSX 10.6.3)以下を変更した。

/*[[self timeScale] longValue],*/
[[self attributeForKey:QTMovieTimeScaleAttribute] longValue],

ちょっと長いけど、以下全ソース。

#import <Foundation/Foundation.h>
#import <QuickTime/QuickTime.h>
#import <QTKit/QTKit.h>

@interface QTMovie (QTMovieExtensions)
- (QTTrack *) addVideoTrackWithSize:(NSSize) aSize;
@end

@implementation QTMovie (QTMovieExtensions)
-(BOOL)isEditable {
NSDictionary *movieDict = [self movieAttributes];
NSNumber *isEditable = [movieDict objectForKey:QTMovieEditableAttribute];

return [isEditable boolValue];
}

- (QTTrack *) addVideoTrackWithSize:(NSSize) aSize {
QTTrack *newTrack = nil;

require( [self isEditable] == YES, NOT_EDITABLE);

Track videoTrack = NewMovieTrack ([self quickTimeMovie],
FixRatio (aSize.width, 1),
FixRatio(aSize.height, 1),
kFullVolume);
require (GetMoviesError() == noErr, NEWTRACK_ERROR);

Handle dataRef = NULL;
Handle hMovieData = NewHandle (0);
require (hMovieData != nil, NEWHANDLE_ERR);
OSErr osErr = PtrToHand (&hMovieData, &dataRef, sizeof(Handle));
require (osErr == noErr, PTRTOHAND_ERROR);

Media videoMedia = NewTrackMedia (videoTrack,
VideoMediaType,
/*[[self timeScale] longValue],*/
[[self attributeForKey:QTMovieTimeScaleAttribute] longValue],

dataRef,
HandleDataHandlerSubType);
require (GetMoviesError() == noErr, TRACKMEDIA_ERROR);

QTTime movieDuration = [self duration];
InsertMediaIntoTrack (videoTrack, 0, 0, movieDuration.timeValue, fixed1);

require (GetMoviesError() == noErr, INSERTMEDIA_ERROR);

newTrack = [QTTrack trackWithQuickTimeTrack: videoTrack error:nil];

return newTrack;

INSERTMEDIA_ERROR:
DisposeTrackMedia(videoMedia);
TRACKMEDIA_ERROR:
PTRTOHAND_ERROR:
DisposeHandle(hMovieData);
NEWHANDLE_ERR:
DisposeMovieTrack (videoTrack);
NEWTRACK_ERROR:
NOT_EDITABLE:

return nil;
}
@end

int main(int argc,char *argv[]) {
int ret = 0;
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

NSString *filename = [NSString stringWithCString: argv[1] encoding: NSUTF8StringEncoding];
if(![QTMovie canInitWithFile:filename]){
NSLog(@"ERR %@ is not a QuickTime format.",filename);
ret = -1;
}else{
NSData *data = [NSData dataWithContentsOfFile:filename];
QTMovie *qtm = [QTMovie movieWithData:data error:nil];

[qtm gotoEnd];
QTTime endTime = [qtm currentTime];
[qtm gotoBeginning];

QTTime QTZeroTime = [qtm currentTime];

QTMovie *newMovie = [[QTMovie alloc] initToWritableData:[NSMutableData data] error:nil];
[newMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];

for(id track in [qtm tracksOfMediaType:@"soun"]){
[newMovie insertSegmentOfTrack:track
fromRange:QTMakeTimeRange(QTZeroTime, [qtm duration])
scaledToRange: QTMakeTimeRange(QTZeroTime, [qtm duration])];
}

//Get the size
NSValue *value = [qtm attributeForKey:QTMovieNaturalSizeAttribute];
NSSize size = [value sizeValue];

// Add a new track to the movie and make it the frontmost layer
QTTrack *newTrack = [newMovie addVideoTrackWithSize:size];

//swap w h
NSRect rect = [[newTrack attributeForKey:QTTrackBoundsAttribute] rectValue];
[newTrack setAttribute:[NSValue valueWithRect:NSMakeRect(0,0,NSHeight(rect),NSWidth(rect))]
forKey:QTTrackBoundsAttribute];

for(;;){
QTTime curTime = [qtm currentTime];
if(QTTimeCompare(curTime,endTime) == NSOrderedSame) break;
NSImage *image = [qtm currentFrameImage];
[qtm stepForward];
QTTime nextTime = [qtm currentTime];
nextTime.timeValue -= curTime.timeValue;

//-----------------------
int degrees = 90;
NSSize beforeSize = [image size];
NSSize afterSize = degrees == 90 || degrees == -90 ? NSMakeSize(beforeSize.height, beforeSize.width) : beforeSize;
NSImage* newImage = [[[NSImage alloc] initWithSize:afterSize] autorelease];
NSAffineTransform* trans = [NSAffineTransform transform];

[newImage lockFocus];
[trans translateXBy:afterSize.width * 0.5 yBy:afterSize.height * 0.5];
[trans rotateByDegrees:degrees];
[trans translateXBy:-beforeSize.width * 0.5 yBy:-beforeSize.height * 0.5];
[trans set];
[image drawAtPoint:NSZeroPoint
fromRect:NSMakeRect(0, 0, beforeSize.width, beforeSize.height)
operation:NSCompositeCopy
fraction:1.0];
[newImage unlockFocus];
//-----------------------

[newTrack addImage:newImage forDuration:nextTime
withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
@"jpeg", QTAddImageCodecType,
nil]];
}

[newMovie writeToFile:@"./test.MOV"
withAttributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:QTMovieFlatten]
error:nil];
}

[pool release];
return ret;
}

コンパイルは、

gcc -arch i386 *.m -framework QuickTime -framework QTKit -framework Cocoa -framework Foundation



これが、縦横入れ替えたQuickTime 、自前アプップローダに上げました。

その他、参考にしたページ。
http://d.hatena.ne.jp/yanagia/20090917/1253198499
http://stackoverflow.com/questions/1594381/cocoa-add-video-watermark-general-info
http://lists.apple.com/archives/cocoa-dev/2003/Sep/msg00748.html
http://www.big.or.jp/~crane/cocoa/0100_imageView/NSRect/index.html
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/128-605a9038

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。