34

HLS ビデオ ストリームを再生している AVPlayer があります。私のユーザー インターフェイスには、ビデオの「チャプター」ごとに 1 つずつボタンの列が用意されています (ボタンには「1」、「2」、「3」というラベルが付けられています)。アプリは、秒単位で示される章のカットイン ポイントのリストを含むサーバーからいくつかのメタデータをダウンロードします。たとえば、1 つのビデオの長さは 12 分です。チャプターのカットイン ポイントのリストは、0、58、71、230、530 などです。

ユーザーが「チャプター ボタン」の 1 つをタップすると、ボタン ハンドラー コードは次のことを行います。

            [self.avPlayer pause];

    [self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600) 
              toleranceBefore: kCMTimeZero 
               toleranceAfter: kCMTimeZero 
            completionHandler: ^(BOOL finished) 
            {
                [self.avPlayer play];
            }];

ここで、「seekTime」は、カットイン ポイントを含むローカル変数です (上記のとおり)。

問題は、ビデオが常に正しいポイントから開始されるとは限らないことです。時々そうです。ただし、要求された seekTime の 10 分の 1 秒から 2 秒前の場合もあります。要求された seekTime の後に開始されることはありません。

ビデオエンコーディングに関する統計は次のとおりです。

エンコーダー: handbrakeCLI コーデック: h.264 フレーム レート: 24 (実際には、23.976 - 撮影時と同じ) ビデオ ビットレート: 複数のビットレート (64/150/300/500/800/1200) オーディオ ビットレート: 128k キーフレーム: 23.976 (毎秒 1 回)

もちろん、Apple の mediafilesegmenter ツールと、variantplaylistcreator を使用してプレイリストを生成しています。

ファイルは Amazon Cloud/S3 バケットから提供されています。

私が不明な点の 1 つは CMTimeMakeWithSeconds です。私が読んださまざまな記事やドキュメントに基づいて、いくつかのバリエーションを試しました。たとえば、上記の抜粋では、次を使用しています。

CMTimeMakeWithSeconds(seekTime, 600)

私も試しました:

CMTimeMakeWithSeconds(seekTime, 1)

どちらが正しいかはわかりませんが、どちらも同じ一貫性のない結果になるようです!

私も試しました:

CMTimeMakeWithSeconds(seekTime, 23.967)

一部の記事では、これは分子/分母のように機能すると主張しているため、n/1 が正しいはずです。ここで、'n' は秒数です (CMTimeMakeWithseconds(n, 1) のように)。しかし、コードはもともと別のプログラマー (現在は亡くなっています) によって作成され、preferredTimeScale (つまり、CMTimeMakeWithseconds(n, 600)) に 600 の数値を使用していました。

私が間違っていること、または私が達成しようとしている種類の精度が可能であっても、誰かが手がかりを提供できますか?

また、誰かが「代替」ソリューションを提供したいという誘惑に駆られた場合に備えて、ビデオをチャプターごとに 1 つずつ別々のストリームに分割することをすでに検討していますが、チャプターの変更に時間がかかるという意味で、同じパフォーマンスが得られるとは考えていません。新しいAVPlayerItemを作成してロードする必要があるため、などなど。したがって、これが機能する唯一の解決策であると思われる場合(そして、これが私たちが望む結果を達成することを期待しています-つまり、各章は希望するところから始めてください)お気軽にそう言ってください。

前もって感謝します!

4

5 に答える 5

1

みたいな機能を使ってください[player seekToTime:CMTimeMakeWithSeconds(seekTime,1)]
許容値kCMTimeZeroはシークに時間がかかるため、 kCMTimeZero の許容値を使用する代わりに、以前に指定した関数と同等のkCMTimeIndefinedを使用できます。

于 2013-01-30T16:52:24.690 に答える