AVAssetWriter перестал записывать в файл в iOS7

Я устраняю проблему с моим приложением, которое отлично работало в iOS6, но когда я обновился до XCode 5 и iOS7, AVAssetWriter перестал записывать видеоданные в файл в каталоге tmp. Я использую AVFoundation с AVCaptureSession для захвата видео. Выходной файл создается, когда начинается запись, но он никогда не загружается никакими видеоданными. FinishWritingWithCompletionHandler работает без ошибок и вызывает обработчик завершения, как и ожидалось.

Кто-нибудь знает, нужно ли мне делать что-то другое с iOS7, что не нужно в iOS6? Мне не удалось найти что-либо в документации.

Вот еще информация...

Расположение временного файла: /var/mobile/Applications/[App ID]/tmp/[TempFileName].MOV

Размер буфера видео сэмпла: 1

Размер буфера аудио сэмпла: 1024

Любая помощь будет оценена.


person Rob    schedule 24.09.2013    source источник


Ответы (3)


У меня был точно такой же сценарий, только на iOS 7.
В моем случае проблема оказалась на самом деле в поврежденном видеофайле, который был захвачен с помощью того же приложения.

Проблема заключалась в том, что после завершения захвата с помощью AVAssetWriter я вызывал 'finishWriting' в фоновом потоке и немедленно получал доступ к медиаданным, прежде чем запись была завершена.

Решил это с помощью «finishWritingWithCompletionHandler:» и доступа к файлу только после завершения записи (обратный вызов из обработчика завершения). Не забудьте отправить обратно в основной поток, потому что обработчик вызывается из фонового потока.

Надеюсь, поможет

person avishic    schedule 03.10.2013
comment
Спасибо за ответ. Наконец-то я нашел проблему сам, но был слишком занят, чтобы ответить на мой вопрос. Итак, я отвечу на свой вопрос тем, что я нашел. - person Rob; 04.10.2013

Я обнаружил, в чем проблема. Сначала я ошибочно обвинил объект AVAssetWriter. Он работал правильно. Настоящая проблема возникла из-за AVPlayerItem. Я использовал AVPlayerItem для определения продолжительности видео. Независимо от того, что я пробовал, он всегда возвращал нулевую продолжительность, из-за чего вызывалась моя видеокомпиляция. Поэтому, чтобы решить проблему, я вместо этого использовал AVAssetItem, чтобы получить продолжительность видео, и это решило мою проблему. Вероятно, я сообщу об этом в Apple как об ошибке в объекте AVPlayerItem.

person Rob    schedule 04.10.2013

авишич был прав. До iOS 7 мне не нужно было включать assetWriter finishWritingWithCompletionHandler, но теперь он сделает файл непригодным для использования, если вы этого не сделаете. Вот код для иллюстрации:

[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
                                                usingBlock:
^{
    CMSampleBufferRef nextBuffer;
    while (assetWriterInput.readyForMoreMediaData)
    {
        nextBuffer = [assetReaderOutput copyNextSampleBuffer];
        if (nextBuffer) {
            //...
        }
        else {
            [assetWriterInput markAsFinished];
            [assetReader cancelReading];
            [assetWriter finishWritingWithCompletionHandler:^{
                //notify your other code that the file is ready
               }];
            return;
        }
}
person n8tr    schedule 14.10.2013