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 OSX で OSX:: を省略してある。
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])