 
     // MARK: Privates
 
-    private var _assets = [AVAsset]() // アセット
+    private var _assets = [AssetHolder]() // アセット
     private var _readers = [AssetReaderFragment]() // リーダー
 
     private var _currentPresentationTimestamp: CMTime = kCMTimeZero

        
        // リーダーが空の場合、まず先頭のアセットを読み込む
        if _readers.isEmpty && startIndex < _assets.count {
            if let assetreader = AssetReaderFragment(asset:_assets[startIndex],
                rate:_playbackRate, startTime:startTime)
            {
                startTime = kCMTimeZero
                _readers.append(assetreader)
            } else {
                NSLog("1) Failed to instantiate a reader of [\((_assets[startIndex] as AVURLAsset).URL.lastPathComponent!)]")
            }
        }

        // 読み込みしていないアセットがあれば読み込む
        outer: for (i, asset) in enumerate(_assets[startIndex..<_assets.count]) {

            let actualIndex = i + startIndex
            // 登録済みの最後のアセットを見つけて、それ以降のアセットを
            // 追加対象として読み込む
            if _readers.last?.asset === asset && actualIndex+1 < _assets.count {
                for target_asset in _assets[actualIndex+1..<_assets.count] {

                    // 読み込み済みリーダーの数が上限になれば処理終了
                    if (_readers.count >= maxNumOfReaders) {
                        break outer
                    }

                    if let assetreader = AssetReaderFragment(asset:target_asset,
                        rate:_playbackRate, startTime:startTime)
                    {
                        startTime = kCMTimeZero
                        _readers.append(assetreader)
                    } else {
                        NSLog("2) Failed to instantiate a reader of [\((target_asset as AVURLAsset).URL.lastPathComponent!)]")
                        break outer
                    }
                }

import AVFoundation

let kMaximumNumOfReaders = 3 // AVAssetReaderで事前にstartReading()しておくムービーの数

/**
* アセット配列に格納するデータ構造。AVAsset.durationなどのvalueにアクセスするのは
* 高コストであるため(iOS8.1.2時点)、値をアセットと共にキャッシュするのが目的
*/
private struct AssetHolder {
    /// 外部から渡されたアセット
    let asset: AVAsset
    /// アセットの再生時間。キャッシュした値があればそれを返す
    var duration: CMTime? {
        mutating get {
            if _duration != nil {
                return _duration
            } else {
                _duration = asset.duration
                return _duration
            }
        }
        set(newDuration) {
            _duration = newDuration
        }
    }
    init(_ asset: AVAsset) {
        self.asset = asset
        // AssetReaderFragmentのビルドに必要な情報を非同期に読み込み始めておく
        // （もしビルドまでに間に合わなかった場合でも、処理がブロックされる
        //   時間を短くできることを狙っている）
        asset.loadValuesAsynchronouslyForKeys(["duration","tracks"]) {
            self._duration = asset.duration
        }
    }
    private var _duration: CMTime? = nil
}

/**
*  アセット配列の中における位置（アセット位置）を表現するデータ構造
