9

この質問でビデオ (オーディオ付き) をエンコードするためのソリューション、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 に違いをもたらすかどうかはわかりません。

4

4 に答える 4

4

私はまだ iOS 9.3.2 でこの問題を経験していました。それを解決したのは、 を呼び出すときAVAssetReaderAudioMixOutput*ではなく、最初にオプションで設定されていることを確認することでした。nil-[AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks]

例:

NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
                                    [NSNumber numberWithFloat:44100.0], AVSampleRateKey,
                                    [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
                                    nil];

// create an AVAssetReaderOutput for the audio tracks
NSArray* audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
AVAssetReaderAudioMixOutput* _audioReaderOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:outputSettings];

-[AVAssetReaderOutput copyNextSampleBuffer]これにより、他の方法で実行しているときに、後で の呼び出しがハングするのを防ぎました。

于 2016-07-27T02:17:24.843 に答える
0

次のようなものを使用して、オーディオ トラックの時間範囲を確認します。

NSLog(@"audioTrack timeRange: %lld, %lld", audioTrack.timeRange.start.value, audioTrack.timeRange.duration.value);

空の時間範囲 (0, 0) により、copyNextSampleBuffer() がハングする可能性があります。

于 2014-01-17T13:35:25.143 に答える
-1

これはハードウェア固有の問題です。シミュレータ、iPhone5、および iPhone 6 でテストしました。問題は特定のビデオ ファイルで 100% 発生しますが、iPhone 5 でのみ発生します。ただし、iPhone 5S について話すことはできません。iOS8 では、この問題は修正されていません。この修正により、iPhone 5 ユーザーの特定の機能を制限する必要がある場合があります。もう 1 つの回避策は、ユーザーにカメラ ロールからビデオを選択させて、Apple の特別な圧縮を強制し、そのビデオを iPhone 5 ハードウェアが使用できる形式に変換することです。

于 2015-07-30T00:06:01.097 に答える
-1

これは、iOS7 の AVFoundation のバグでした。現在、iOS8 で修正されています。

于 2014-09-20T19:26:52.310 に答える