QuickTime をもう少し使ってみる

今までのメモがほとんどメソッドの羅列に近いので、ここでは、実際使ってみたときの使い方なんかをメモしようと思う。

だから、情報としては、QuickTime ムービーを扱うQuickTime ムービーをアプリケーション上で扱うと重複する部分もあると思う。

QTMovie オブジェクトを作る

まず、QTMovie オブジェクトを作る。QuickTime ムービーをアプリケーション上で扱うでやったように、

ファイルから読み込む方法もあるし、空のオブジェクトを作って、後で中身をコピーアンドペーストとかで足していくとかもできる。

まあ、ファイルから読み込むなら、自分でパネルを使って読み込むときは、movieWIthFile_error(file,error) とか

movieWithURL_error(url,error) とかを使う。Document-based アプリケーションで、その辺りは自動で NSData を受け取る場合なんかは、

movieWithData_error(data,error) などを使う。空っぽのものを作るときは、全く何もない状態なら movie というメソッドで、

何かしらの属性を指定するなら、 movieWithAttributes_error(attributes,error) を使う。

error = NSError.new

@qtMovie.movieWIthFile_error(filename,error)

@qtMovie.movieWithURL_error(fileURL,error)

@qtMovie.movie

attributes = NSDictionary.alloc.initWithObjects_forKeys(objectArray,keyArrary)

@qtMovie.movieWithAttributes_error(attributes,error)

どんな attribute が設定できるかは、デベロッパドキュメントを見てください。いくつかはこのページの下にもメモしたけど。

これ以外にも、movieWithTimeRange_error(range,error) を使って、既にある QTMovie オブジェクトから新たな QTTime オブジェクトが作れる。

range は QTRange で error は NSError.

@newQTMovie = @qtMovie.movieWithTimeRange_error(range,error)

属性を得る/設定する

QTMovie オブエジェクトの属性には、簡単に得られるものとそうでないものがある。

現在時間

currentTime QTTime が返ってくる。

setCurrentTime(time) QTTime で設定する。

currentTIme = @qtMovie.currentTime

@qtMovie.setCurrentTime(currentTime)

長さ

duration QTMovie の時間の長さが QTTime が返ってくる。

duration = @qtMovie.duration

再生速度

rate 現在の再生速度が float で返ってくる。

setRate(rate) float で設定する。1.0 で通常速度。これより大きいと速く小さいと遅くなる。

rate = @qtMovie.rate

@qtMovie.setRate(1.0)

音量

volume 現在の音量が float で返ってくる。

setVolume(volume) float で設定する。0 から 1.0 で設定するらしいんだが、1.0 以上にも設定できるらしい。試してないけど。

volume = @qtMovie.volume

@qtMovie.setVolume(1.0)

消音

muted(true/false) 消音状態の設定。true で消音。

@qtMovie.muted(false)

これ以外でもまだ設定できるものがある。その場合は、属性を指定して値を設定したり、属性の値を得たりする。

setAttribute_forKey(attribute,key) key で指定した属性に値を設定する。

movieAttributes 属性をすべて得る。NSDictionary オブジェクトで返ってくる。

attributeForKey(attribute) 指定した属性の値を得る。

@qtMovie.setAttribute_forKey(attribute,key)

attributes = @qtMovie.movieAttributes

anAttribute = @qtMovie.attributeForKey(key)

例えば、選択された部分があればそこだけを再生するように設定するには QTMoviePlaysSelectionOnlyAttribute を key にする。

@qtMovie.setAttribute_forKey(true,QTMoviePlaysSelectionOnlyAttribute)

少し応用で、画面に表示されている QTMovie オブジェクトをファイルに保存したい場合、そのまま保存すると、

ファイルを開いたときに、保存したときの表示の大きさで開くようになったりする。そこで、元々の大きさで開くようにしたい場合は、

attributeForKey(key)QTMovieNaturalSizeAttribute を key にして元々の大きさを得て、それを setAttribute_forKey で

QTMovieCurrentSizeAttribute を key にして現在の大きさに設定してから保存する。

@qtMovie.setAttribute_forKey(@qtMovie.attributeForKey(QTMovieNaturalSizeAttribute),QTMovieCurrentSizeAttribute)

QTTime

QTTime が実はくせ者(と思った)。上に書いたようなメソッドを使うと QTTime で返ってくるんだけど、

足したり引いたりするのに、普通の計算式が使えない。ここでは、QTTime の関数の使い方をメモする。

ちなみに、ここでは include OSXOSX:: を省略してある。

include OSX

なので、include しない場合は、下の QTMakeTime は、

OSX::QTMakeTime(120,24) #=> 5 秒

となる。

QTZeroTime これは定数なんだけど、QTTime がゼロというのをあらわす。下の QTStringFromTime で表示すると、"0:00:00:00.00/1000000" とでた。

QTMakeTime(timeValue,timeScale) 数値と時間単位から QTTime を作る。時間単位が 30 なら 1 秒を表す数値は 30。

timeValue というメソッドを使うと、QTTime から timeValue が得られる。

QTMakeTime(120,24) #=> 5 秒

QTMakeTime(120,24).timeValue #=> 120

QTTimeFromString(string) NSString オブジェクトから QTTime を作る。フォーマットは "0:00:00:00.00/00"(0 は数字)。

"日:時:分:秒/時間単位" になっている。このフォーマットにそっていないと、0:00:00:00.00/1000000 という QTTime が作られる。

フレームレートが 30 で 15 分の QTTime を作るには、次のようにする。

QTTimeFromString("0:00:15:00.00/30")

QTStringFromTime(QTTime) これは、QTTime から上のフォーマットの時間を NSString で得ることができる。

QTStringFromTime(QTTimeFromString("0:00:15:00.00/30")) #=> <NSCFString "0:00:15:00.00/30">

QTMakeTimeWithTimeInterval(interval) これは、秒数を表す数字から QTTime を作る。時間単位は 1000000 になる。

30 秒から作るときは、次のようになる。

QTMakeTimeWithTimeInterval(30) #=> 0:00:00:30.00/1000000

QTMakeTimeScaled(QTTime,timeScale) これは、QTTime の時間単位を timeScale で与えられたものにする。

なので、上の QTMakeTimeWithTimeInterval(interval) で作った後にこれを使って時間単位を設定できる。

QTMakeTimeScaled(QTMakeTimeWithTimeInterval(30),30) #=> 0:00:00:30.00/30

QTTimeIncrement(QTTime,QTTime) 2つの QTTime を足す。

QTTimeDecrement(QTTime1,QTTime2) QTTime1 から QTTime2 を引く。マイナスにもなる。

a = QTTimeFromString("0:00:00:05.50/250")

b = QTTimeFromString("0:00:02:15.50/250")

QTTimeIncrement(a,b) #=> 0:00:02:20.100/250

QTTimeDecrement(b,a) #=> 0:00:02:10.00/250

2つの時間単位が違う場合でも、ちゃんと計算してくれる。

a = QTTimeFromString("0:00:00:05.50/250")

b = QTTimeFromString("0:00:02:15.50/150")

QTTimeIncrement(a,b) #=> 0:00:02:20.400/750

QTTimeCompare(QTTime1,QTTime2) QTTime1 と QTTime 2 を比べる。QTTime1 が大きければ 1、QTTime2 が大きければ -1、同じなら 0 が返る。

a = QTTimeFromString("0:00:00:05.50/250")

b = QTTimeFromString("0:00:02:15.50/150")

QTTimeCompare(a,b) #=> -1

QTTimeRange

QTMakeTimeRange(QTTime[startTime],QTTIme[duration]) 指定の時間から指定した時間の長さの QTTimeRange を作る。

a = QTTimeFromString("0:00:01:00.00/30")

b = QTTimeFromString("0:00:02:00.00/30")

QTMakeTimeRange(a,b) #=> 0:00:01:00.00/30~0:00:02:00.00/30

QTTimeRangeFromString(string) NSString から QTTimeRange を作る。フォーマットは 0:00:00:00.00/00~0:00:00:00.00/00。

"日:時:分:秒/時間単位~日:時:分:秒/時間単位" になっている。

QTTimeRangeFromString("0:00:01:00.00/30~0:00:02:00.00/30")

QTStringFromTimeRange(QTTimeRange) QTTimeRange から上のフォーマットの時間の範囲を得られる。

QTStringFromTimeRange(QTTimeRangeFromString("0:00:01:00.00/30~0:00:02:00.00/30")) #=> <NSCFString "0:00:01:00.00/30~0:00:02:00.00/30">

QTTimeRangeEnd(QTTimeRange) QTTimeRange の終わりの時間を QTTime で返す。

a = QTTimeRangeFromString("0:00:01:00.00/30~0:00:03:00.00/30")

QTStringFromTime(QTTimeRangeEnd(a)) #=> 0:00:04:00.00/30

QTEqualTimeRanges(QTTimeRange1,QTTimeRange2) 2つの QTTimeRange を比べる。同じなら true 違えば false が返る。

a = QTTimeRangeFromString("0:00:01:00.00/30~0:00:02:00.00/30")

b = QTTimeRangeFromString("0:00:02:00.00/30~0:00:02:00.00/30")

QTEqualTimeRanges(a,b) #=> false

QTIntersectionTimeRange(QTTimeRange2,QTTImeRange2) 2つの QTTimeRange が重なる最大値を QTTimeRange で返す。

a = QTTimeRangeFromString("0:00:01:00.00/30~0:00:02:00.00/30")

b = QTTimeRangeFromString("0:00:02:00.00/30~0:00:02:00.00/30")

QTIntersectionTimeRange(a,b) #=> 0:00:02:00.00/30~0:00:01:00.00/30

これは、1つ目が1秒目から2秒間(1秒目から3秒目まで)、2つ目が2秒目から2秒間(2秒目から4秒目まで)なので、

重なっている2秒目から1秒間(2秒目から3秒目まで)が返ってきている。

QTTimeInTimeRange(QTTime,QTTimeRange) これは、QTTime が QTTimeRange に含まれるかどうかを返す。含まれていれば true、そうでなければ false。

a = QTTimeFromString("0:00:02:00.00/30")

b = QTTimeRangeFromString("0:00:01:00.00/30~0:00:03:00.00/30")

QTTimeInTimeRange(a,b) #=> true

QTUnionTimeRange(QTTimeRange1,QTTimeRange2) 2つの QTTimeRange をあわせて最小の QTTimeRange を返す。

まあ、2つの範囲の開始時間の早い方の時間から、2つの範囲の終了時間の遅い方の時間までの範囲を返す。

a = QTTimeRangeFromString("0:00:01:00.00/30~0:00:02:00.00/30")

b = QTTimeRangeFromString("0:00:02:00.00/30~0:00:02:00.00/30")

QTStringFromTimeRange(QTUnionTimeRange(a,b)) #=> 0:00:01:00.00/30~0:00:03:00.00/30

これは、1つ目が1秒目から2秒間(1秒目から3秒目まで)、2つ目が2秒目から2秒間(2秒目から4秒目まで)なので、

1秒目から3秒間(1秒目から4秒目まで)が返ってきた。

チャプター

chapters QTMovie オブジェクトのすべてのチャプター情報を得る。NSDictionary オブジェクトの Array が返る。

NSDictionary オブジェクトは、QTMovieChapterName (NSString) と、QTMovieChapterStartTime (NSValue[QTTime])。

title はそのまま NSString、time は NSValue なので、QTTimeValue で QTTime に変換する。

chapters = @qtMovie.chapters

chapterTime = chapters["QTMovieChapterStartTime"].QTTimeValue

chapterTitle = chapter["QTMovieChapterName"]

hasChapters QTMovie オブジェクトにチャプターがあるかどうかを true/false で返す。

@qtMovie.hasChapters

chapterCount チャプターの数を整数で返す。

@qtMovie.chapterCount

addChapters_withAttributes_error(chapterArray,attributes,error) チャプターを QTMovie オブジェクトに追加する。

上に書いたようにチャプター情報は QTMovieChapterName と QTMovieChapterStartTime を key とする NSDictionary の

配列で保存されているので、それを作る。前者は普通の文字列、後者は NSValue なので、valueWithQTTime で

QTTime から NSValue オブジェクトを作って Dictionary に登録する。まあ、Hash で行けるのでそうする。

attribute は今のところ映像トラックを指定するだけらしいので、nil を入れておけば最初の映像トラックにチャプターが入る。

普通は映像トラックは1つしかないはずだから、nil で問題ないはず。error は NSError オブジェクト。

chaperArray = Array.new

chapterHash = Hash.new

chapterHash["QTMovieChapterName"] = "Title"

chapterHash["QTMovieChapterStartTime"] = NSValue.valueWithQTTime(qtTime)

chaperArray << chapterHash

error = NSError.new

@qtMovie.addChapters_withAttributes_error(chaperArray,nil,error)

一つでも範囲外だったりしてエラーが起きると一つも追加されない(当然だけど)。

removeChapters QTMovie オブジェクトからチャプターをすべて取り除く。

@qtMovie.removeChapters

startTimeOfChapter(integer) integer で指定した n 番目のチャプターの開始時間を QTTime で返す。

@qtMovie.startTimeOfChapter(3)

chapterIndexForTime(QTTime) QTTime で指定した時間がどのチャプターにあるかをチャプター番号で返す。

@qtMovie.chapterIndexForTime(qtTime)

範囲選択

selectionStart (プレーヤー上で)選択された範囲のはじめの時間を QTTime で返す。

@qtMovie.selectionStart

selectionEnd (プレーヤー上で)選択された範囲の終わりの時間を QTTime で返す。

@qtMovie.selectionEnd

selectionDuration (プレーヤー上で)選択された範囲の長さを QTTime で返す。

@qtMovie.selectionDuration

setSelection(QTTimeRange) QTMovie オブジェクトの QTTimeRange で指定された範囲を選択する。

@qtMovie.setSelection(qtRange)

保存

まず、最初の2つはファイルから開いた QTMovie オブジェクトに対して、元ファイルに保存する場合。

canUpdateMovieFile QTMovie オブジェクトを読み込んだ元のファイルが更新できるか true/false で返す。

@qtMovie.canUpdateMovieFile

updateMovieFile ファイルから読み込まれた QTMovie オブジェクトのファイルの情報を更新する。

@qtMovie.updateMovieFile

新規に作った QTMovie オブジェクトを保存する場合や、ファイルから読み込んだものを別のファイルに保存する場合。

writeToFile_withAttributes_error(fileName,attributes,error) ファイル名を指定して、新規に保存する。attributes については、

細かいことはよくわかっていなかったりするが、NSDictionary で指定する。error は NSError.

attributes = NSMutableDictionary.alloc.init

attributes.setValue_forKey(true,QTMovieFlatten)

@qtMovie.writeToFile_withAttributes_error(fileName,attributes,error)

QTMovieExport (BOOL) - 保存ではなく書き出しにするかどうか

QTMovieExportType (NSString[formatType]) - 書き出し時のファイルタイプ。このページの下の方にリストがあった。

QTMovieFlatten (BOOL) - これを true にしないと参照ファイルが保存されるらしい。

QTMovieExportSettings ?? - ドキュメントにも記述がない。

QTMovieExportManufacturer ?? - よくわかってない。

QTMovie Attributes

括弧内は、それぞれの属性のデータの型。NSValue の場合は変換する。NSNumber は普通に数値で float なのは小数。

NSValue で、それぞれを作ったり値を得たりするには次に記すメソッドを使う。

NSSize

value = NSValue.valueWithSize(size)

size = value.sizeValue

QTTime

value = NSValue.valueWIthQTTime(qtTime)

qtTime = value.QTTimeValu

QTRange

value = NSValue.valueWithQTRange(atRange)

qtRange = value.QTRange

何を表すかは名前でわかるはず。これと、値の組み合わせを NSDictionary オブジェクトにするんだけど Ruby の Hash オブジェクトでいい。

QTMovieCurrentSizeAttribute (NSValue[NSSize])

QTMovieCurrentTimeAttribute (NSValue[QTTime])

QTMovieDisplayNameAttribute (NSString)

QTMovieHasVideoAttribute (BOOL)

QTMovieHasAudioAttribute (BOOL)

QTMovieLoopsAttribute (BOOL)

QTMovieNaturalSizeAttribute (NSValue[NSSize])

QTMoviePlaysSelectionOnlyAttribute (BOOL)

QTMoviePreferredRateAttribute (NSNumber[float])

QTMoviePreferredVolumeAttribute (NSNumber[float])

QTMovieRateAttribute (NSNumber[float])

QTMovieRateChangesPreservePitchAttribute (BOOL) これは、たぶんスピードを変えても音程を変えないかどうかだと思う。CPU がおそいと無視される。

QTMovieSelectionAttribute (NSValue[QTTimeRange])

QTMovieTimeScaleAttribute (NSNumber[long])

QTMovieVolumeAttribute (NSNumber[float])