2016-09-18 28 views
8

AVPlayer losowo tylko odtwarzać dźwięk, nie pokazując ścieżkę wideo ...odtwarzanie AVPlayer nie jest aktywny podczas AVAssetExportSession jak iOS 10

odtwarzania wideo poprawnie AVPlayer mając aktywną sesję kompresji AVAssetExportSession:exportAsynchronouslyWithCompletionHandler jest teraz zawodzi. Wydaje się, że powoduje to pewną niestabilność, która utrzymuje się, dopóki aplikacja nie przejdzie w tło i wróci.

Badanie AVURLAsset podczas odtwarzania wideo nie działa, jest ścieżka wideo, nawet jeśli nie ma wyjścia wideo. Nie otrzymuję również żadnych błędów ze sprężarki ani innych składników odtwarzania ... Problem występuje nawet przez chwilę po powrocie sesji kompresji.

Próbowałem różnych wątków na różne sposoby bez powodzenia.

Wydaje się, że od 10 iOS istnieje coś się dzieje pod maską, która powoduje jakiś konflikt między obu procesów ...

+1

masz przykładowy projekt, który odtwarza problem? –

+0

@RhythmicFistman Jeszcze nie zrobiłem przykładowego projektu. W tej chwili zdecydowałem się na wyłączenie opcji kompresowania po wystąpieniu w czasie rzeczywistym, aby obejść problem. FYI, [to inne pytanie] (http://stackoverflow.com/questions/39300675/white-video-when-opening-avmutablecomposition-in-instagram?noredirect=1#comment66438880_39300675) wydaje się być tym samym błędem. –

+1

Jakie są Twoje kategorie i opcje "AVAudioSession"? –

Odpowiedz

8

właśnie usłyszał od firmy Apple DTS. Zgadzają się także, że to wskazuje na błąd Apple iOS i poprosił mnie o zalogowanie.

Całkowicie odcięło korzystanie z AVAssetExportSession i rozwiązało problem. Dlatego wywołanie AVAssetExportSession w połączeniu z innymi metodami AV jest przyczyną niestabilności systemu iOS.

W moim przypadku użyłem AVAssetExportSession do kompresji po wychwyceniu. Zamiast tego użyłem AVAssetWriter, aby wypróbować każdą klatkę w czasie rzeczywistym do formatu, którego potrzebowałem ...

To powinno zostać naprawione wkrótce przez Apple, mam nadzieję.

+0

Jeśli ktoś znajdzie obejście lub słyszy o tym od Apple, czy może dodać komentarz, jak to zrobił? Musiałem ustawić tło wideo jako komunikat nakazujący użytkownikowi zamknąć i otworzyć aplikację, co jest naprawdę okropnym doświadczeniem. – Ethan

+0

W jaki sposób używasz "AVPlayer" i "AVAssetExportSession"? –

+0

Używam AVExportSession, aby połączyć kilka filmów razem, a następnie odtwarzając wynikowy film wideo przy użyciu AVPlayer – Ethan

1

Znalazłem rozwiązanie mojego problemu. Tak jak powiedział Sami, wydaje się, że problem dotyczy AVVideoCompositionCoreAnimationTool, którego używałem do oznaczenia znaku wodnego mojego wideo. Przeniosłem się na CIFILter, który i tak miał czystszy kod.

usunąłem wszystko z CoreAnimationTool i używane to (mixComposition jest mój AVMutableComposition):

let watermarkFilter = CIFilter(name: "CISourceOverCompositing")! 
let watermarkImage = CIImage(image: #imageLiteral(resourceName: "watermark"))! 
let videoComposition = AVVideoComposition(asset: mixComposition) { (filteringRequest) in 
    let source = filteringRequest.sourceImage.clampingToExtent() 
    watermarkFilter.setValue(source, forKey: "inputBackgroundImage") 
    let transform = CGAffineTransform(translationX: filteringRequest.sourceImage.extent.width - watermarkImage.extent.width - 2, y: 0) 
    watermarkFilter.setValue(watermarkImage.applying(transform), forKey: "inputImage") 
    filteringRequest.finish(with: watermarkFilter.outputImage!, context: nil) 
} 

a następnie w AVAssetExportSession dodanych w tym:

exporter!.videoComposition = videoComposition 

nadzieję, że pomoże kogoś!

+0

Czy nadal używasz AVAssetExportSession: exportAsynchronouslyWithCompletionHandl er? –

Powiązane problemy