После реализации решения по кодированию видео (со звуком) в этом вопросе Кодирование видео с использованием AVAssetWriter - АВАРИИ, я обнаружил, что код корректно работает в симуляторе iPhone. К сожалению, некоторые видео не могут кодировать звук при работе на реальном iPhone 5 (и других устройствах).
Например, видео, сгенерированные из примера кода RosyWriter WWDC 2011 (https://developer.apple.com/library/IOS/samplecode/RosyWriter/Introduction/Intro.html) кодировать не полностью, поскольку функция -[AVAssetReaderOutput copyNextSampleBuffer]
никогда не возвращается.
Видеобуферы приходят корректно, но как только пытается скопировать первый аудио CMSampleBufferRef, вызов зависает. Когда я пробую это на видео из других источников, например, записанных в родном приложении iOS Camera, звук импортируется правильно.
Эта ветка, https://groups.google.com/forum/#!topic/coreaudio-api/F4cqCu99nUI отмечает зависание функции copyNextSampleBuffer
при использовании с AudioQueues и предлагает выполнять операции в одном потоке. Я пытался хранить все в отдельном потоке, в основном потоке, но не повезло.
Кто-нибудь еще сталкивался с этим и имел возможное решение?
РЕДАКТИРОВАТЬ: кажется, что дорожки видео, созданные с помощью RosyWriter, перевернуты по сравнению с видео из собственного приложения «Камера», т. е. аудиопоток как поток 0, а видеопоток как поток 1.
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 60 kb/s
Metadata:
creation_time : 2013-10-28 16:13:05
handler_name : Core Media Data Handler
Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080, 8716 kb/s, 28.99 fps, 29.97 tbr, 600 tbn, 1200 tbc
Metadata:
rotate : 90
creation_time : 2013-10-28 16:13:05
handler_name : Core Media Data Handler
Не уверен, что это имеет значение для AVAssetReader.