Получение точного количества кадров из фрагмента ролика - PullRequest
0 голосов
/ 08 ноября 2011

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

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

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

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

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

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

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

редактировать

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

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

1 голос
/ 08 ноября 2011

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

0 голосов
/ 31 марта 2016

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

0 голосов
/ 31 марта 2016

вот еще один хороший ответ 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 в этом методе.

...