У меня есть класс, написанный с использованием 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
код должен работать. Я не понимаю, что мне делать по-другому. Есть идеи?