Получение точного количества кадров из мувиклипа

Я создаю приложение для iphone для анализа видео, и мне нужно знать точное количество кадров в видеоклипе.

Я получил частоту кадров и продолжительность, и по какой-то причине я получаю 2880 кадров, но я знаю, что в видеоклипе на самом деле 2840.

как я могу получить точное количество кадров?


person Or Ron    schedule 08.11.2011    source источник


Ответы (4)


Ну, это будет зависеть от формата видео.

Если это необработанное видео, то PAL и SECAM диктуют 25 кадров в секунду (fps), фактический фильм NTSC 29,97 - 24 кадра в секунду. Это чересстрочная или прогрессивная развертка?

Он уже сжат и, следовательно, использует аппроксимацию номеров кадров?

изменить

Итак, ваше видео в стандарте H.264/MPEG4 со звуком AAC? Данные индексирования хранятся в части «moov» файла, которая содержит все значения индексации и данных, составляющие файл. Дополнительную информацию о стандарте MPEG4 см. здесь

Если вы можете извлечь эти данные, он сообщит вам размер данных каждого кадра и т. д.

person ChrisBD    schedule 08.11.2011
comment
Видео стандартное и чересстрочное против прогрессивного абсолютно никак не связано с захваченным количеством кадров. - person ; 08.11.2011
comment
в частности, это H.264, AAC, снятый iPad - person Or Ron; 08.11.2011
comment
natko - на самом деле это так, если Or.Ron обрабатывал необработанное видео (YUV, RGB и т.д.). Так как он обрабатывает сжатый формат. - person ChrisBD; 08.11.2011
comment
Ха может открыть этот H264 и прочитать количество кадров из метаданных. Его нет только в некоторых редких случаях. Цветовой формат, стандарт видео и тип сканирования никак не связаны с количеством захваченных кадров. - person ; 08.11.2011
comment
Как я уже сказал - только потому, что он обрабатывает сжатый формат, а не необработанный формат видео. - person ChrisBD; 08.11.2011

Точное количество кадров обычно записывается где-то внутри файла, и его можно получить. Но видеофайл может содержать больше или меньше кадров. Например, вы получаете 2880 кадров и знаете, что должны получить 2840. Я предполагаю, что некоторые метки времени равны. Декодированный кадр с той же отметкой времени, что и предыдущий, следует пропустить/игнорировать. Вы проверили это? Вы также можете получить меньше кадров, чем сообщается. Это означает, что некоторые кадры имеют большую продолжительность, чем ожидалось. Например, если у вас есть видеоклип, записанный с частотой 25 кадров в секунду, продолжительность одного кадра составляет 40 мс. Однако после распаковки вы можете получить кадр длительностью 80. Такой кадр действительно должен иметь такую ​​длительность, иначе он может повторяться дважды...

person Community    schedule 08.11.2011
comment
Я не смог найти общее количество кадров в файле, а частота кадров составляет 29,3. Дело в том, что мне нужно знать номер кадра, прежде чем я начну читать все кадры. - person Or Ron; 08.11.2011
comment
Сначала вы написали, что я знаю, что в ролике на самом деле 2840, а теперь вы говорите, что я не смог найти общее количество кадров в файле. Как вы получили 2840 в первую очередь?? Попробуйте декодировать кадр за кадром и отображать отметку времени для каждого декодированного кадра. P.S. Я предполагаю, что вы читаете ТОЛЬКО один видеопоток из этого видеоклипа. - person ; 08.11.2011
comment
В видео не было 2840, я считал, что оно идет кадр за кадром. и да, я читаю только видеодорожку фильма! По сути, вы говорите, что нет никакого способа узнать точное общее количество кадров? - person Or Ron; 08.11.2011
comment
Да, это возможно. Например, ffmpeg сообщит вам количество кадров для любого допустимого видеоклипа H.264. - person ; 08.11.2011
comment
Итак, как вы думаете, этот инструмент реализует это? просто (длительность) * (кадров в секунду) ? - person Or Ron; 08.11.2011
comment
Да, но это только оценка. Вы пытались получить количество кадров из метаданных (если они доступны)? - person ; 08.11.2011
comment
Нет, я просто работаю над этим. Он говорит мне, что доступные типы метаданных: com.apple.quicktime.udta и com.apple.quicktime.mdta - person Or Ron; 08.11.2011
comment
Есть ли в вашей среде что-то вроде GetMediaSampleCount() API? Если это так, что он возвращает для видеодорожки? - person ; 09.11.2011

вот еще один хороший ответ Rhythmic Fistman в iOS Определите Количество кадров в видео. это в SWIFT, но я пробовал, как показано ниже (Objective-C):

- (void)getTotalFramesFromVideo{
    AVURLAsset* asset = [AVURLAsset assetWithURL:URL1];
    NSError* errReader=nil;
    AVAssetReader* reader = [AVAssetReader assetReaderWithAsset:asset error:&errReader];
    if(!errReader){
        AVAssetTrack* track = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
        AVAssetReaderOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil];
        [reader addOutput:readerOutput];
        [reader startReading];
        long long count = 0;
        BOOL isAvailable = NO;
        do {
            CMSampleBufferRef ref = [readerOutput copyNextSampleBuffer];
            if(ref){
                isAvailable = YES;
                count++;
            }else{
                isAvailable = NO;
            }
        } while (isAvailable == YES);
        NSLog(@"Total Frames in your Video is %@",@(count));
    }else{
        NSLog(@"\nAVAssetReaderError:\n%@",errReader.localizedDescription);
    }
}

это может быть полезно для кого-то вроде меня, кто хочет получить количество кадров видео.
ПРИМЕЧАНИЕ: вы также можете получить CMSampleBufferRef этим методом.

person Vatsal Shukla    schedule 31.03.2016

Реальный способ подсчитать количество кадров — запросить продолжительность кадра, а затем разделить общую продолжительность фильма в секундах на продолжительность кадра. Предложение прочитать все кадры слишком медленное, чтобы его можно было использовать для чего-либо, кроме коротких видеороликов. Существует также проблема дельта-кадров в потоке H.264. Вы можете запросить длину дорожки через AVAssetTrack.timeRange, а затем продолжительность кадра можно запросить через AVAssetTrack.minFrameDuration. Пример рабочего исходного кода, выполняющего этот расчет, можно найти здесь. Обратите внимание, что эти значения CMTime необходимо преобразовать в значения времени с плавающей запятой, передав их через CMTimeGetSeconds().

person MoDJ    schedule 31.03.2016