2013-06-28 6 views
0

У меня есть класс, написанный с использованием QTKit, который читает и создает файлы фильмов QuickTime. Моя функция добавления звуковой дорожки в фильм, который отлично работает на Snow Leopard, не работает на Lion или Mountain Lion. Звуковая информация появляется в «Show Movie Inspector» в проигрывателе QuickTime, и фильм соответствует правильной длительности. Однако при воспроизведении видео звук не слышен. Вот мой код, который отлично работает в 10.6, но не 10,7 или 10,8:QTKit QTMovie :: insertSegmentOfTrack не работает на OS X 10.7 или 10.8

// here's the code that creates the exported movie 
NSString *filePath = [NSString stringWithUTF8String:"Foo.mov"]; 
NSError *errorPtr; 
qtMovie = [[QTMovie alloc] initToWritableFile:filePath error:&errorPtr]; 

// and now here is my function to add an audio track 
bool PLQTMovie::addSoundTrack(const std::string &fileName, const long long srcStartTime, const long long srcEndTime, const long long dstStartTime) 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    NSString *file = [NSString stringWithUTF8String:fileName.c_str()]; 
    NSError *errorPtr = nil; 
    QTMovie *audioMovie = [QTMovie movieWithFile:file error:&errorPtr]; 

    NSArray *tracks = [audioMovie tracksOfMediaType:QTMediaTypeSound]; 
    if([tracks count] == 0) 
    return false; 

    QTTrack *soundTrack = [tracks objectAtIndex:0]; 
    QTMedia *media = [soundTrack media]; 
    NSValue *durationValue = [media attributeForKey:QTMediaDurationAttribute]; 
    QTTime soundTrackTime; 
    [durationValue getValue:&soundTrackTime]; 
    long audioScale = soundTrackTime.timeScale; 

    long long srcDuration = 0; 
    if(srcEndTime < 0) // use entire source track duration 
    { 
    srcDuration = soundTrackTime.timeValue; 
    } 
    else 
    { 
    srcDuration = srcEndTime - srcStartTime; 
    } 

    QTTime startTime = QTMakeTime(srcStartTime, audioScale); 
    QTTime srcDurationTime = QTMakeTime(srcDuration, audioScale); 
    QTTimeRange srcTimeRange = QTMakeTimeRange(startTime, srcDurationTime); 
    QTTime dstTime = QTMakeTime(dstStartTime, audioScale); 

    QTTrack *audioTrack = [(QTMovie*)qtMovie insertSegmentOfTrack:soundTrack timeRange:srcTimeRange atTime:dstTime]; 

    [pool drain]; 

    return true; 
} 

Я знаю, что компания Apple рекомендует переход от QTKit к AV Foundation, но старый QTKit код должен работать. Я не понимаю, что мне делать по-другому. Есть идеи?

ответ

0

Не знаю, поможет ли это, но у нас была аналогичная проблема, и ответ оказался таким, что вам нужно сгладить фильм после добавления звука.

В принципе, нам пришлось записать фильм в файл tmp, а затем экспортировать его с помощью [QTMovie writeToFile:withAttributes:error] с атрибутом QTMovieFlatten, установленным в YES.

Надеюсь, что это поможет, поэтому я могу начать возвращать некоторые из замечательных советов/ответов, которые я получил здесь.