ボタンの無効化が上手くいきません。
stopButton.isEnabled = false
print("ループの前")
for _ in 0...(startPoint) {
sample = readerOutput.copyNextSampleBuffer()
while reader.status != AVAssetReaderStatus.reading {
sleep(UInt32(0.1))
}
}
print("ループの後")
上記のようなソースですが、
ビデオファイルからサンプルバッファを取り出すループで、
ビデオの頭出しをしています。
このループの前でstopButtonを無効にしても、
ボタンが有効のままです。
ループが終了したところで無効になります。
ループの前でちゃんと無効化する方法はないでしょうか。
よろしくご教示のほどお願いします。
===========================
let avAsset = AVURLAsset(url: fileURL, options: options)
var reader: AVAssetReader! = nil
do {
reader = try AVAssetReader(asset: avAsset)
} catch {
#if DEBUG
print("could not initialize reader.")
#endif
return
}
guard let videoTrack = avAsset.tracks(withMediaType: AVMediaType.video).last else {
#if DEBUG
print("could not retrieve the video track.")
#endif
return
}
let readerOutputSettings: [String: Any] =
[kCVPixelBufferPixelFormatTypeKey as String :
Int(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)]
let readerOutput = AVAssetReaderTrackOutput(track: videoTrack,
outputSettings: readerOutputSettings)
reader.add(readerOutput)
reader.startReading()
var sample:CMSampleBuffer!
stopButton.isEnabled=false
for _ in 0...(startPoint) {
sample = readerOutput.copyNextSampleBuffer()
while reader.status != AVAssetReaderStatus.reading {
sleep(UInt32(0.1))
}
}
ちょっと前のコードから書いてみました。
startPoint はビデオのフレーム数で、その数値を直接設定できないか
色々と探したんですが、見つける事が出来ず、
不甲斐ないことに、そのフレーム数まで空回りさせています。
ご指摘頂いた timerange は
フレーム数の直接設定のヒントかと思い、
reader もしくは readerOutput のなかに
timerange に関する何かないか探してみましたが
上手く解決出来ませんでした。
よろしくお願いします。
dispatchQuene
でちゃんと?動いてはいます。
ですが、ループ後の処理で(そのコードは書いていませんが)
main thread でしかやってはいけないよと
warningが出ていてます。
この解決も上手くいってはいません。