2011-02-18 3 views
2

QTKit을 사용하여 동영상에서 원시 오디오를 추출하려고하므로 파형을 그릴 수 있습니다. 다음 코드를 사용하고 있지만 출력 프레임은 모두 0입니다. 내가 뭘 잘못하고 있는지에 대한 어떤 생각? (당신은 또한 여기에 프로젝트를 다운로드 할 수 있습니다 http://richcollins.net/AudioSample.zip를)QTKit을 사용하여 동영상에서 원시 오디오를 추출하는 방법

NSError *error; 

QTMovie *movie = [QTMovie movieWithFile:[[NSBundle mainBundle] pathForResource:@"Sosumi" ofType:@"aiff"] error:&error]; 

if(error) 
{ 
    NSLog(@"movieWithFile Error: %@", [error localizedDescription]); 
    exit(1); 
} 

OSStatus err = noErr; 

MovieAudioExtractionRef extractionSessionRef = nil; 
err = MovieAudioExtractionBegin([movie quickTimeMovie], 0, &extractionSessionRef); 

AudioStreamBasicDescription asbd; 
err = MovieAudioExtractionGetProperty(extractionSessionRef, 
             kQTPropertyClass_MovieAudioExtraction_Audio, 
             kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, 
             sizeof (asbd), &asbd, nil); 

if (err) 
{ 
    NSLog(@"MovieAudioExtractionGetProperty Error: %i", err); 
    exit(1); 
} 

AudioBufferList *bufferList = calloc(1, sizeof(AudioBufferList) + asbd.mChannelsPerFrame*sizeof(AudioBuffer)); 
bufferList->mNumberBuffers = asbd.mChannelsPerFrame; 

QTTime duration = [[movie attributeForKey:QTMovieDurationAttribute] QTTimeValue]; 
long long estimatedFrameCount = (long long)ceil(((double)duration.timeValue*asbd.mSampleRate)/duration.timeScale); 

int i; 
for (i = 0; i < asbd.mChannelsPerFrame; i ++) 
{ 
    AudioBuffer audioBuffer = bufferList->mBuffers[i]; 
    audioBuffer.mNumberChannels = 1; 
    audioBuffer.mDataByteSize = estimatedFrameCount*sizeof(Float32); 
    audioBuffer.mData = calloc(1, estimatedFrameCount*sizeof(Float32)); 
    bufferList->mBuffers[i] = audioBuffer; 
} 

UInt32 numFrames; 
UInt32 flags; 
UInt32 actualFrameCount = 0; 

while (true) 
{ 
    err = MovieAudioExtractionFillBuffer(extractionSessionRef, &numFrames, bufferList, &flags); 
    if (err) 
    { 
     NSLog(@"MovieAudioExtractionFillBuffer Error: %i", err); 
     exit(1); 
    } 
    actualFrameCount += numFrames; 
    if (flags & kQTMovieAudioExtractionComplete) 
    { 
     NSLog(@"break"); 
     break; 
    } 
} 

for (i = 0; i < asbd.mChannelsPerFrame; i ++) 
{ 
    printf("channel %i\n", i); 
    Float32 *frames = (Float32 *)bufferList->mBuffers[i].mData; 
    int j; 
    for (j = 0; j < actualFrameCount; j ++) 
    { 
     printf("%f,", frames[j]); 
    } 
    printf("\n"); 
} 

err = MovieAudioExtractionEnd(extractionSessionRef); 
if (err) 
{ 
    NSLog(@"MovieAudioExtractionEnd Error: %i", err); 
    exit(1); 
} 

답변

1

그것은 numFramesMovieAudioExtractionFillBuffer에 대한 참조를 전달하기 전에 설정해야합니다 것으로 나타났다.

관련 문제