Nie wiem, to będzie działać, ale zamiast używać MPMoviePlayerController
można użyć AVPlayer i obsłudze i AVSynchronizedLayer zsynchronizować OpenGL warstwy taktowanie z jednym AVPlayerLayer
„s.
Można by stworzyć odtwarzacz wideo tak:
NSURL *videoURL = [NSURL fileURLWithPath:@"your_url"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
UIView *playerView = [[UIView alloc] initWithFrame:frame];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
[playerLayer setFrame:[[playerView layer] bounds]];
następnie utworzyć AVSynchronizedLayer
warstwę i zsynchronizować go z playerLayer
:
AVSynchronizedLayer *syncLayer = [AVSynchronizedLayer synchronizedLayerWithPlayerItem:playerItem];
[syncLayer addSublayer:yourGlView.layer];
[playerView.layer addSublayer:playerLayer];
[playerView.layer addSublayer:syncLayer];
[self.view addSubview:playerView];
...
w jaki sposób grasz wideo? Korzystając z wbudowanego widoku lub kontrolera zamkniętego odtwarzacza wideo, czy wyciągasz ramki jeden po drugim przez AVFoundation, a następnie je gdzieś spychasz? – Tommy
Odtwarzam wideo przez MPMoviePlayerController. Mogę następnie użyć CurrentPlaybackTime pomnożonego przez ilość klatek na sekundę, aby uzyskać numer klatki, ale problem polega na tym, że wideo odtwarzane jest z inną szybkością klatek niż mój renderer OpenGL. Czy istnieje sposób na zsynchronizowanie tych dwóch elementów, aby zawsze upewnić się, że moja warstwa warstwy otwartej renderuje się na górze każdej klatki w filmie, zanim zostanie wyświetlona następna klatka wideo? – sinsro
Czy znalazłeś rozwiązanie tego problemu? Mam ten sam problem. –