program tip

iOS AVPlayer 시작 지연을 줄이는 방법

radiobox 2020. 8. 2. 18:04
반응형

iOS AVPlayer 시작 지연을 줄이는 방법


아래 질문에 대해 : 모든 자산은 장치에서 로컬이며 네트워크 스트리밍이 수행되지 않습니다. 비디오에는 오디오 트랙이 포함되어 있습니다.

문제의 비디오 클립을 시작하기 위해 최소한의 지연 시간으로 비디오 파일을 재생 해야하는 iOS 응용 프로그램을 개발 중입니다. 불행히도 실제로 시작해야 할 때까지 다음에 어떤 특정 비디오 클립이 있는지 알 수 없습니다. 구체적으로 : 하나의 비디오 클립이 재생되면 다음 10 개의 비디오 클립 세트가 무엇인지 알지만 다음 클립을 '즉시'재생할 때까지 정확히 어느 비디오 클립을 알지 못합니다.

실제 시작 지연을 확인하기 위해 수행 한 작업 addBoundaryTimeObserverForTimes은 비디오 플레이어 를 호출 하고 비디오가 실제로 재생되기 시작한 시간을 1 밀리 초로 표시하는 것입니다. 재생할 자산을 나타내는 코드

내가 지금까지 본 것에서, 나는 AVAsset로딩 의 조합을 사용하고 AVPlayerItem준비가되면 그로부터 from 을 생성 한 다음 AVPlayerStatusReadyToPlay재생을 호출하기 전에 기다리는 것이 1 ~ 3 초 사이에서 시작하는 경향이 있음을 발견 클립.

그 이후로 나는 전화 [AVPlayerItem playerItemWithURL:]AVPlayerItemStatusReadyToPlay연주를 기다리는 것과 거의 동등한 것으로 전환했습니다 . 거의 동일한 성능.

내가 관찰하고있는 한 가지는 첫 번째 AVPlayer 항목로드가 나머지 것보다 느리다는 것입니다. 첫 번째 비디오를 재생하기 전에 짧은 / 빈 자산으로 AVPlayer를 사전 비행하는 것이 좋은 아이디어 일 것 같습니다. [ 소리를 처음 재생할 때 AVAudioPlayer의 느린 시작

동영상 시작 시간을 최대한 줄이려고하고 실험 할 아이디어가 있지만 도움을 줄 수있는 사람의 안내를 받고 싶습니다.

업데이트 : 아래 아이디어 7, 구현으로 약 500ms의 전환 시간이 산출됩니다. 이것은 개선 사항이지만 더 빨리 얻는 것이 좋습니다.

아이디어 1 : N AVPlayer 사용 (작동하지 않음)

~ 10 개의 AVPPlayer객체를 사용하고 ~ 10 개의 클립을 모두 시작 및 일시 정지하고, 실제로 필요한 클립을 알고 나면 올바로 전환하고 일시 정지를 해제 AVPlayer한 후 다음주기 동안 다시 시작하십시오.

AVPlayer'siOS에서는 약 4 개가 활성화 되어 있기 때문에 이것이 효과가 있다고 생각하지 않습니다 . 여기에 누군가가 OverOverflow에 대해 묻는 질문이 있었고 4 개의 AVPlayer 제한에 대해 알아 냈습니다. 동영상 간 빠른 전환-탐색 사용

아이디어 2 : AVQueuePlayer 사용 (작동하지 않음)

나는 10을 밀어 AVPlayerItems넣으면 AVQueuePlayer완벽하게 시작하기 위해 모두를 미리로드 할 것이라고 믿지 않습니다 . AVQueuePlayer대기열입니다. 대기열의 다음 동영상 만 즉시 재생할 수 있도록 준비한다고 생각합니다. ~ 10 개의 동영상 중 어느 것이 시작될 때까지 재생할지 모르겠습니다. ios-avplayer-video-preloading

아이디어 3 : AVPlayerItems백그라운드에서 로드, 재생 및 유지 (아직 100 % 확실하지는 않지만 좋지 않음)

백그라운드에서 각 비디오 클립의 첫 번째 초를로드하고 재생하고 (비디오 및 오디오 출력 억제) 각각에 대한 참조를 유지하고 AVPlayerItem재생해야 할 항목을 알고있는 경우 이점을 찾고 있습니다 실제로 그 중 하나를 바꾸고 백그라운드 AVPlayer를 활성 상태로 바꿉니다. 헹구고 반복하십시오.

이론에 따르면 최근에 재생 된 파일에는 AVPlayer/AVPlayerItem여전히 준비된 리소스가있을 수 있으므로 후속 재생 속도가 더 빠릅니다. 지금까지 나는 이것으로부터 이점을 보지 못했지만 AVPlayerLayer배경에 대해 올바르게 설정 되지 않았을 수 있습니다 . 나는 이것이 내가 본 것에서 실제로 것들을 향상시킬 것이라고 의심한다.

아이디어 4 : 다른 파일 형식을 사용하면로드 속도가 더 빠를 수 있습니다.

현재 .m4v (video-MPEG4) H.264 형식을 사용하고 있습니다. H.264에는 다양한 코덱 옵션이 있으므로 일부 옵션은 다른 옵션보다 검색 속도가 빠를 수 있습니다. 파일 크기를 더 작게 만드는 고급 설정을 사용하면 탐색 시간이 증가하지만 다른 방법으로 옵션을 찾지 못했습니다.

아이디어 5 : 무손실 비디오 형식 + AVQueuePlayer의 조합

빠르게로드 할 수있는 비디오 형식이 있지만 파일 크기가 좋지 않은 경우 비디오 클립의 처음 10 초를 부풀지만로드하기는 더 빠른 버전으로 미리 준비하는 것이 좋습니다. H.264로 인코딩 된 자산으로 AVQueuePlayer를 사용하고 압축되지 않은 파일 형식으로 처음 10 초를 추가 한 다음 H.264에있는 것부터 시작하여 준비 / 예압 시간이 최대 10 초가되도록하십시오. 따라서 빠른 시작 시간뿐만 아니라 더 컴팩트 한 형식의 이점도 얻을 수 있습니다.

아이디어 6 : 비표준 AVPlayer 사용 / 내 자신 쓰기 / 다른 사람 사용

내 요구에 따라 AVPlayer를 사용할 수는 없지만 AVAssetReader에 의존하고 처음 몇 초 (원시 파일을 디스크에 기록 할 수 있음)를 디코딩해야하며 재생시 원시 형식을 사용하여 재생하십시오. 다시 빨리. 나에게 큰 프로젝트 인 것 같고 순진한 방식으로 진행하면 더 잘 작동하지 않을 수 있습니다. 디코딩 및 압축되지 않은 각 비디오 프레임은 2.25MB입니다. 순진하게 말하면 비디오에 ~ 30fps를 사용하면 디스크 당 60MB의 디스크 읽기 요구 사항이 생겨 불가능할 것입니다. 분명히 우리는 일정 수준의 이미지 압축 (아마도 PVRTC를 통한 네이티브 openGL / es 압축 형식)을 수행해야하지만 ... 정말 미친 것입니다. 어쩌면 내가 사용할 수있는 라이브러리가 있습니까?

아이디어 7 : 모든 것을 단일 영화 자산으로 결합하고 seekToTime

위의 일부보다 쉬운 아이디어는 모든 것을 단일 영화로 결합하고 seekToTime을 사용하는 것입니다. 문제는 우리가 모든 곳을 뛰어 다니는 것입니다. 영화에 본질적으로 무작위로 액세스합니다. 나는 이것이 실제로 잘 작동 할 수 있다고 생각합니다 : avplayer-movie-playing-lag-in-ios5

어떤 접근법이 가장 좋을 것이라고 생각하십니까? 지금까지 지연을 줄이는 측면에서 많은 진전을 이루지 못했습니다.


저작물을 만든 후에는 자산이 준비되지 않았거나 동영상 재생 시간과 같은 계산이 수행 될 수 있습니다. 파일에 동영상의 모든 메타 데이터가 포함되어 있는지 확인하십시오.


옵션 # 7을 먼저 시도해야 작동합니다. 탐색 시간이 클립 사이를 매끄럽게 전환하기에 충분히 빠르지 않기 때문에 실제로는 필요하지 않을 것으로 생각됩니다. 시도하고 실패하면 옵션 4/6을 수행 하고이 목적을 위해 특별히 설계된 iOS 라이브러리를 살펴보십시오 .AVAnimator에서 빠른 Google 검색을 수행하여 자세한 내용을 확인하십시오. 내 라이브러리를 사용하면 원활한 루프를 구현하고 한 클립에서 다른 클립으로 전환 할 수 있습니다. 비디오를 미리 파일로 디코딩해야하기 때문에 매우 빠릅니다. 귀하의 경우 시작하기 전에 10 개의 비디오 클립이 모두 파일로 디코딩되지만 그 사이에서 전환하는 것이 빠릅니다.


iOS 10.x 이상에서 AVPlayer 시작 지연을 줄이려면 설정 avplayer.automaticallyWaitsToMinimizeStalling = false;했습니다. 이것은 다른 결과를 초래할 수 있지만 아직 그 결과를 얻지 못했습니다.

https://stackoverflow.com/a/50598525/9620547 에서 아이디어를 얻었습니다.


Without having done anything like this in the past, based on your thoughts and experiences I would try a combination of 7 and 1: Preload one AVPlayer with the first couple of seconds of the 10 follow up videos. Then skipping will very likely be faster and more reliable due to less data. While you are playing the selected piece, you have enough time to prepare the AVPlayer for the rest of the selected follow up video in the background. When the beginning is finished, you switch to the prepared AVPlayer. So in total, you at any given time have a maximum of 2 AVPlayers loaded.

Of course I don't know whether the switching can be done so smoothly that it does not disturb playback.

(Would have added this as a comment if I could.)

Best, Peter


If I understood your issue correctly, it seems that you have one continuous video to which you need to load the audio track for on a moment's notice.

If that is the case I suggest looking into BASS. BASS is an audio library much like AVPlayer that gives you (relatively) easy access to the low-level API's of the AudioUnits framework in iOS. What does the mean for you? It means that with a tiny bit of buffer manipulation (you may not even need it, depends on how tiny you want the delay) you can start playing music instantly.

The limitations however extend to video, as I said, it is an audio library so any video manipulation will still have to be done with AVPlayer. However using-seekToTime:toleranfeBefore:toleranceAfter: you should be able to achieve fast seeking within the video as long as you preroll with all the necessary options.

If you're syncing across multiple devices (which your application might suggest) just leave a comment and I'd be happy to edit my answer.

PS: BASS may look daunting at first because of it's C-like format, but it's really really easy to use for what it is.


Here are several properties and methods provided by the AVAsset class that may help:

- (void)_pu_setCachedDuration:(id)arg1;
- (id)pu_cachedDuration; 
- (struct
 { 
   long long x1; 
   int x2;
   unsigned int x3; 
   long long x4; 
})pu_duration;
- (void)pu_loadDurationWithCompletionHandler:(id /* block */)arg1;

참고URL : https://stackoverflow.com/questions/11171374/how-to-reduce-ios-avplayer-start-delay

반응형