1

ビデオをファイルパスにダウンロードすると、テーブルビューに表示されるために [tableview reloadData] が必要なのはなぜですか?

私はこの問題で 3 日間立ち往生しており、非常に当惑しています。devforum がダウンしているのは残念です。

基本的に、私はテーブルビューを持っています。各テーブル ビュー セルには、AVPlayer と特定のリモート URL があります。cellForRowAtIndexPath では、ビデオ データがローカルに保存されていない場合、ダウンロードしてファイルに保存し、AVPlayer は保存されたファイルの場所でビデオの再生を試みます。

問題は、何も再生されないことです。

ビデオをレンダリングするため[tableView reloadData]にそれぞれを呼び出さない限り。cellForRowAtIndexPathこれはパフォーマンスに非常に悪いだけでなく、ユーザーにとってもあまり良くない可能性があることに気付いたので、reloadRowsAtIndexPath各セルを使用しようとしましたが、うまくいきません。

特定のローカル ファイルの場所からデータを読み込むために、アプリで reloadData を呼び出す必要があるのはなぜですか? reloadRowsAtIndexPath が機能しないのはなぜですか? 最近ファイル パスに書き込まれたビデオ データを取得するという点で、2 つの違いは何ですか。

テーブルビューをリロードしないと、アプリが特定のファイルパスの新しいデータを認識しないだけです。


コード

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *const cellIdentifier = @"cellIdentifier";
        AVideoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[self getURL:someURLString forIndexPath:indexPath] options:nil];
        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
        if (!cell) {
            cell = [[AVideoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            cell.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
            AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:cell.player];
            cell.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
            layer.frame = CGRectMake(10.0, 10.0, 300.0, 179.0);
            [cell.layer addSublayer: layer];
        }
        else {
            [cell.player replaceCurrentItemWithPlayerItem:playerItem];
        }
        [cell.player play];

    }
4

2 に答える 2

0

テーブルの各セルでビデオを再生しようとしていますか? それはうまくいきません。ビデオの再生は、リソースを大量に消費します。それぞれ独自のプレーヤーを持つテーブル ビュー セルにビデオ レイヤーを追加することは、初心者向けではありません。正しく行われなければ、Table View が静止画像でうまく機能するのは十分に困難です。テーブル セルにリアルタイムでビデオを表示することはほぼ不可能です。設計へのアプローチを再考する必要があります。たぶん、表のセルに各ビデオのポスター画像をロードして、ユーザーがセルをタップしたときに再生しますか?

ただし、自分で確認できるようにこのルートを使用することを主張する場合は、ファイル URL をインスタンス化するために正しい NSURL メソッドを使用していない可能性が高いと思います。次の行にブレークポイントを設定します。

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:
                      [self getURL:someURLString forIndexPath:indexPath] 
                                        options:nil];

次に、その行をまたいで、アセット変数の上にマウスを置きます。nil の場合、メソッドでインスタンス化している NSURL に何か問題がありますgetURL:forIndexPath:

[NSURL fileURLWithPath:]ディスクからロードするために使用していることを確認してください。iOS では、ファイル URL と Web URL が区別されます。また、使用しているファイル URL にファイルが実際に存在することを確認してください。

于 2013-07-23T20:44:16.867 に答える