AVURLAsset получает размер видео

Я не смотрел исходный код VBulletin за некоторое время, но способ, которым они занимались в 2003 году, заключался в том, чтобы встроить вызов на свой сервер внутри кода. IIRC, он был на очень длинной строке кода (например, 200-300 + символов долго) и был разбит на несколько конкатенаций строк и т. Д.

Он не сделал ничего «плохого», если вы его пиратствовали - форум все еще работал на 100%. Но IP-адрес вашего сервера был зарегистрирован вместе с другой информацией, и они использовали это для расследования и принятия юридических мер.

Ваш номер лицензии был встроен в этот вызов, чтобы они могли легко отслеживать количество IP-адресов / веб-сайтов, на которых была запущена данная лицензионная копия.

23
задан kelin 12 February 2018 в 07:26
поделиться

6 ответов

Я только что проверил документацию онлайн, и метод naturalSize устарел для объекта AVAsset. Однако всегда должен быть AVAssetTrack, который ссылается на AVAsset, а AVAssetTrack имеет метод naturalSize, который вы можете вызвать.

naturalSize

Естественные размеры медиаданных, на которые ссылается дорожка. (только для чтения)

@property (неатомарный, только для чтения) CGSize naturalSize

Доступность

Доступно в iOS 4.0 и более поздних версиях. Объявлено в AVAssetTrack.h

Через: Справочник AVAssetTrack для iOS

29
ответ дан C4 - Travis 12 February 2018 в 07:26
поделиться

Разрешение в Swift 3:

func resolutionSizeForLocalVideo(url:NSURL) -> CGSize? {
    guard let track = AVAsset(URL: url).tracksWithMediaType(AVMediaTypeVideo).first else { return nil }
    let size = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform)
    return CGSize(width: fabs(size.width), height: fabs(size.height))
}

Для Swift 4:

func resolutionSizeForLocalVideo(url:NSURL) -> CGSize? {
    guard let track = AVAsset(url: url as URL).tracks(withMediaType: AVMediaType.video).first else { return nil }
    let size = track.naturalSize.applying(track.preferredTransform)
    return CGSize(width: fabs(size.width), height: fabs(size.height))
}

Решения без preferredTransform не возвращают правильные значения для некоторых видео на последних устройствах!

26
ответ дан Scott McKenzie 12 February 2018 в 07:26
поделиться

Предупреждение об устаревании в официальной документации предлагает: «Вместо этого используйте naturalSize и preferredTransform, при необходимости, видеодорожки ресурса (см. Также tracksWithMediaType: »). ). "

Я изменил свой код с:

CGSize size = [movieAsset naturalSize];

на

CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];

Теперь он менее симпатичный и менее безопасный, но не сломается, когда они уронят этот код. метод.

25
ответ дан Dave Burt 12 February 2018 в 07:26
поделиться

Предупреждение об устаревании гласит:

Use the naturalSize and preferredTransform, as appropriate, 
of the asset’s video tracks instead (see also tracksWithMediaType:).

Итак, нам нужен AVAssetTrack , и мы хотим, чтобы его naturalSize и предпочитали Transform . Доступ к этому можно получить с помощью следующего:

AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
CGSize dimensions = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);

актив , очевидно, ваш AVAsset .

16
ответ дан dloomb 12 February 2018 в 07:26
поделиться

Чтобы получить размерность AVAsset, вы должны рассчитать объединение всех визуальных дорожек визуальных дорожек (после применения их соответствующего предпочтительного преобразования):

CGRect unionRect = CGRectZero;
for (AVAssetTrack *track in [asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual]) {
    CGRect trackRect = CGRectApplyAffineTransform(CGRectMake(0.f,
                                                             0.f,
                                                             track.naturalSize.width,
                                                             track.naturalSize.height),
                                                  track.preferredTransform);
    unionRect = CGRectUnion(unionRect, trackRect);
}
CGSize naturalSize = unionRect.size;

Методы, основанные на CGSizeApplyAffineTransform, терпят неудачу когда ваш ресурс содержит треки с нетривиальным аффинным преобразованием (например, повороты на 45 градусов) или если ваш ресурс содержит треки с различным происхождением (например, два трека, воспроизводимые рядом с началом второго трека, увеличиваются по ширине первого дорожка).

См .: MediaPlayerPrivateAVFoundationCF::sizeChanged() на https://opensource.apple.com/source/WebCore/WebCore-7536.30.2/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp

2
ответ дан David H 12 February 2018 в 07:26
поделиться

Это довольно простое расширение для AVAsset в Swift 4 , чтобы получить размер видео, если доступно:

extension AVAsset {
    var screenSize: CGSize? {
        if let track = tracks(withMediaType: .video).first {
            let size = __CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform)
            return CGSize(width: fabs(size.width), height: fabs(size.height))
        } 
        return nil
    }
}
2
ответ дан CodeBender 12 February 2018 в 07:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: