0

AVFoundation이 가능해야하는 것처럼 보이기 위해 AVFoundation을 적용하려고했지만 내 시나리오에서는 지원이나 예제를 찾을 수 없습니다.Core Audio를 통해 라이브 오디오에 대해 AVAssetWriterInput을 사용할 수 있습니까?

앞면 카메라에서 비디오를 가져와 코어 오디오에서 가져온 오디오와 결합해야합니다.

카메라에서 비디오를 잡아 내고 마이크의 오디오와 결합하는 일반적인 경우를 해결하는 코드가 있습니다. 이것은 대부분 RosyWriter Apple 샘플 코드에서 수정되었습니다.

그러나 Core Audio에서 나오는 오디오의 라이브 스트림을 사용하고 AVAssetWriterInput을 만들어 내 AVCaptureSession에 입력으로 추가 할 방법이 없습니다. AVCaptureInput 및 AVAssetWriterInput을 설정하는 것과 관련된 모든 리소스는 장치로 초기화하고 장치에서 미디어를 실시간으로 잡아내는 것을 중심으로하지만 장치에서 오디오를 가져 오려고하지는 않습니다.

AVCaptureInput을 생성하고 특정 ASBD 형식의 데이터가 필요하다고 말한 다음 Core Audio 콜백에서 해당 데이터를 제공 할 수 있습니까? 디스크에 데이터를 쓰고 디스크에서 읽는 것을 원하지 않습니다. 매우 느릴 것 같습니다. 해결책이 있어야하지만 찾을 수없는 것 같습니다.

필자는 오디오를 포함하기 위해 사용하는 AudioBufferList 개체에서 CMSampleBuffers를 생성하는 코드를 가지고 있습니다. 나는 CMSampleBuffers를 검사했고 그들은 유효한 데이터 프레임을 포함하고있는 것처럼 보였습니다. 그러나 수정 된 RosyWriterViewProcessor "writeSampleBuffer : ofType :"에 해당 데이터를 보내면 올바르게 쓰여진 것처럼 보입니다. (에러가 없습니다)하지만 비디오 파일이 끝나면 비디오 만보고 오디오는 들리지 않습니다.

아무에게도 내가하려는 일을 수행하는 방법에 대한 조언이 없습니까? 여기

는 내내 내가 사용하고 표준 ASBD입니다 :

AudioStreamBasicDescription audioDescription; 
memset(&audioDescription, 0, sizeof(audioDescription)); 
audioDescription.mFormatID   = kAudioFormatLinearPCM; 
audioDescription.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; 
audioDescription.mChannelsPerFrame = 2; 
audioDescription.mBytesPerPacket = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
audioDescription.mFramesPerPacket = 1; 
audioDescription.mBytesPerFrame  = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
audioDescription.mBitsPerChannel = 8 * sizeof(SInt16); 
audioDescription.mSampleRate  = 44100.0; 

해결책 없다면, 나는 내가 AVComposition를 사용하여 함께 패치 수 있다고 생각 별도의 비디오 및 오디오 파일을 가지고 있지만 차라리하지 않는 게 좋을 내 비디오 및 오디오 파일은 정기적으로 길이가 다르기 때문에 그 경로를 따라 가야합니다. 그리고 트랙 하나 또는 다른 트랙을 서로 맞추기 위해 전투를하고 싶지는 않습니다. 동기화가 끝나지 않을 수도 있습니다! 차라리 AVCaptureSession에서 모든 것을 설정하고 AVFoundation이 나를 위해 모든 것을 인터리빙하는 작업을 수행하게하십시오.

+0

혹시 이것을 알아 냈습니까? – user3344977

답변

0

원시 PCM 형식을 사용하여 유효한 자산 작성자 입력을 만들지 만 콜백에서 해당 입력의 데이터를 버리고 오디오 장치에서 생성 한 버퍼의 동일한 길이의 데이터로 대체하십시오.

+0

그 방법에 대한 힌트를 좀 주시겠습니까? 콜백을 할 때 "requestMediaDataWhenReadyOnQueue : usingBlock :"으로 초기화하거나 "appendSampleBuffer :"를 사용하여 초기화하는 것을 의미합니까? – patcoll

관련 문제