この質問でビデオ (オーディオ付き) をエンコードするためのソリューション、AVAssetWriter を使用したビデオ エンコーディング - CRASHES を実装した後、コードが iPhone シミュレーターで正しく動作することがわかりました。残念ながら、特定のビデオは、実際の iPhone 5 (およびその他のデバイス) で実行中にオーディオのエンコードに失敗します。
たとえば、WWDC 2011 のサンプル コード RosyWriter ( https://developer.apple.com/library/IOS/samplecode/RosyWriter/Introduction/Intro.html-[AVAssetReaderOutput copyNextSampleBuffer]
) から生成されたビデオは、関数が返されないため、完全にはエンコードされません。
ビデオ バッファは正しく取得されますが、最初のオーディオ CMSampleBufferRef をコピーしようとするとすぐに、呼び出しがハングします。ネイティブの iOS カメラ アプリで記録されたものなど、他のソースからのビデオでこれを試してみると、オーディオは正しくインポートされます。
このスレッドhttps://groups.google.com/forum/#!topic/coreaudio-api/F4cqCu99nUIは、AudioQueues で使用すると関数がハングすることを指摘copyNextSampleBuffer
し、単一のスレッドで操作を維持することを提案しています。メインスレッドの別のスレッドにすべてを保持しようとしましたが、うまくいきませんでした。
他の誰かがこれを経験し、可能な解決策を持っていましたか?
編集: 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 に違いをもたらすかどうかはわかりません。