Техническое примечание TN2404

Новая основа AV APIs в OS X Yosemite для профессиональных видео потоков операций

Основа AV в OS X Yosemite представляет новые функции профессиональных видео потоков операций. Они включают классы для итерации и исследования выборок в носители, поддержка ссылочных фильмов URL, записи фрагментированных файлов ролика, улучшений к поддержке формата файла DV и несжатой поддержке фильма.

Этот документ обеспечивает общий обзор этих новых функций.

Новые классы для демонстрационного самоанализа носителей и загрузки: AVSampleCursor и AVSampleBufferGenerator
Ссылочная поддержка фильма URL
Фрагментированная поддержка фильма
Потоковая поддержка формата файла DV
Несжатая поддержка фильма
История версии документа

Новые классы для демонстрационного самоанализа носителей и загрузки: AVSampleCursor и AVSampleBufferGenerator

AVSampleCursor

AVAssetTrack теперь методы поддержек для создания AVSampleCursor объекты.  AVSampleCursor объекты могут использоваться, чтобы выполнить итерации и исследовать выборки в носители (как мог быть сделан с теперь осуждаемым QuickTime APIs такой как GetMediaNextInterestingTime, GetMediaSampleReference и CopyMediaMutableSampleTable).

Самый простой случай создает экземпляр AVSampleCursor от AVAssetTrack и расположение его в первом (или в последний раз) выборка носителей в порядке декодирования. Необходимо всегда сначала проверять AVAssetTrack canProvideSampleCursors свойство, чтобы определить, может ли актив обеспечить экземпляры AVSampleCursor для того, чтобы пересечь его выборки носителей и обнаружить информацию о них. См. Перечисление 1.

Перечисление 1  , создающее AVSampleCursor объект от AVAssetTrack экземпляр.

AVAssetTrack *assetTrack = <#An AVAssetTrack#>;
if (assetTrack.canProvideSampleCursors)
{
    // Create an instance of AVSampleCursor and position it at the receiver's
    // first media sample in decode order.
    AVSampleCursor *cursor = [assetTrack makeSampleCursorAtFirstSampleInDecodeOrder];
 
    // Do something interesting with the AVSampleCursor
 
}

AVSampleCursor может также быть создан и расположен в или около указанной метки времени представления:

Перечисление 2  Создает и инициализирует a AVSampleCursor объект от AVAssetTrack и метка времени.

AVAssetTrack *assetTrack = <#An AVAssetTrack#>;
if (assetTrack.canProvideSampleCursors)
{
    CMTime presentationTimeStamp = <#A time stamp#>;
    // Create an instance of AVSampleCursor and position it at the specified time stamp
    AVSampleCursor *cursor =
        [assetTrack makeSampleCursorWithPresentationTimeStamp:presentationTimeStamp];
 
    // Do something interesting with the AVSampleCursor
 
}

AVSampleCursor может пересечь через поданное число выборок, декодируют порядок с помощью stepInDecodeOrderByCount метод, или в порядке представления с помощью stepInPresentationOrderByCount метод. Точно так же можно изменить местоположение курсора определенным deltaTime на декодировании или временной шкале представления с помощью stepByDecodeTime:wasPinned: и stepByPresentationTime:wasPinned: методы, соответственно.

Можно сравнить относительные позиции двух AVSampleCursors с comparePositionInDecodeOrderWithPositionOfCursor метод. Можно также протестировать границу в переупорядочении от порядка декодирования до порядка представления с samplesWithEarlierDecodeTimeStampsMayHaveLaterPresentationTimeStampsThanCursor и samplesWithLaterDecodeTimeStampsMayHaveEarlierPresentationTimeStampsThanCursor методы.

AVSampleCursor объект может предоставить различную информацию о выборке носителей в ее текущей позиции, такой как ее продолжительность, представление и декодировать метки времени, его возможность, которая будет декодироваться независимо от других выборок носителей, сместите и длина в его контейнере хранения, и предназначается ли выборка, чтобы быть загруженной другими непрерывными выборками носителей в «блоке».

Посмотрите AVSampleCursor.h и AVAssetTrack.h для получения дополнительной информации.

AVSampleBufferGenerator

AVSampleBufferGenerator класс предоставляет гибкие услуги для загрузки выборок, на которые ссылаются AVSampleCursor в CMSampleBuffer объекты. Каждый запрос на CMSampleBuffer создание описано в AVSampleBufferRequest объект.

Использовать AVSampleBufferGenerator, сначала создайте AVSampleBufferRequest объект и набор его свойства для конфигурирования запроса:

  Создание перечисления 3 и конфигурирование AVSampleBufferRequest объект.

// Create a AVSampleBufferRequest object from an AVSampleCursor.
AVSampleCursor *cursor = <#An AVSampleCursor#>;
AVSampleBufferRequest *sampleBufferRequest =
    [[AVSampleBufferRequest alloc] initWithStartCursor:cursor];
if (sampleBufferRequest)
{
    // Configure the AVSampleBufferRequest
    // See AVSampleBufferGenerator.h for more information
    sampleBufferRequest.direction = AVSampleBufferRequestDirectionForward;
 
    // Do something interesting with the AVSampleBufferRequest
 
}

Вы создаете AVSampleBufferGenerator объект от AVAsset экземпляр с помощью initWithAsset метод. Если Вы передадите, запрос будет непосредственен NULL для CMTimebase параметр или набор AVSampleBufferRequestModeImmediate как режим; или запланированный, если Вы передаете допустимое CMTimebase значение и набор AVSampleBufferRequestModeScheduled как режим.

 

Генерировать a CMSampleBuffer от AVSampleBufferGenerator объект, вызовите AVSampleBufferGenerator createSampleBufferForRequest метод, передавая Ваш AVSampleBufferRequest экземпляр в качестве параметра. См. Перечисление 4.

Перечисление 4  , генерирующее a CMSampleBuffer от AVSampleBufferGenerator объект.

AVSampleBufferRequest *sampleBufferRequest = <#An AVSampleBufferRequest for the AVAsset#>;
AVAsset *asset = <#The AVAsset#>;
AVSampleBufferGenerator *generator =
    [[AVSampleBufferGenerator alloc] initWithAsset:asset timebase:NULL];
if (generator)
{
    CMSampleBufferRef samplebuffer =
        [generator createSampleBufferForRequest:sampleBufferRequest];
 
    // Do something interesting with sample buffer.
 
    // For example:
    // CMItemCount itemCount = CMSampleBufferGetNumSamples(samplebuffer);
    // etc.
 
    // See CMSampleBufferRef.h
 
    CFRelease(samplebuffer);
}

Посмотрите AVSampleBufferGenerator.h для получения дополнительной информации.

Ссылочная поддержка фильма URL

В OS X Yosemite Основа AV поддерживает ссылочные фильмы, где файл ролика может не фактически содержать демонстрационные данные фильма. Такие файлы ролика содержат относительный или абсолютный URLs к другим файлам, где хранятся демонстрационные данные. Ссылочные фильмы URL могут проигрываться через AVPlayer.  

Новое AVAssetReaderOutput подкласс, AVAssetReaderSampleReferenceOutput, позволяет Вам читать CMSampleBufferкоторые содержат абсолютный URL и смещение вместо демонстрационных данных. Создать AVAssetReaderSampleReferenceOutput объект, Вы предоставляете дорожку актива для который который получающееся AVAssetReaderSampleReferenceOutput должен обеспечить демонстрационные ссылки. Дорожка должна быть одной из дорожек, содержавших к установленному сроку AVAssetReaderактив.

Клиенты могут извлечь информацию о расположении (файл URL и сместить) выборок в дорожке путем добавления экземпляра AVAssetReaderSampleReferenceOutput к AVAssetReader использование AVAssetReader addOutput метод как показано в Перечислении 5.

Перечисление 5  , создающее AVAssetReaderSampleReferenceOutput объект и добавление его как AVAssetReader вывод.

AVAssetReader *assetReader = <#an asset reader#>;
AVAssetTrack *aTrack = <#an asset track contained by the asset reader's asset#>;
 
AVAssetReaderSampleReferenceOutput *sampleRefOutput =
    [AVAssetReaderSampleReferenceOutput assetReaderSampleReferenceOutputWithTrack: aTrack];
 
// Add AVAssetReaderSampleReferenceOutput to the AVAssetReader
[assetReader addOutput: sampleRefOutput];

Никакие фактические демонстрационные данные не могут быть извлечены с помощью AVAssetReaderSampleReferenceOutput класс. Расположение демонстрационных данных описано kCMSampleBufferAttachmentKey_SampleReferenceURL и kCMSampleBufferAttachmentKey_SampleReferenceByteOffset присоединения на извлеченном демонстрационном буфере. Используйте CMGetAttachment API для получения этих присоединений от демонстрационного буфера. Перечисление 6 показывает пример.

Перечисление 6  добирается kCMSampleBufferAttachmentKey_SampleReferenceURL, kCMSampleBufferAttachmentKey_SampleReferenceByteOffset присоединения от демонстрационного буфера.

CMSampleBufferRef sampleBuffer = <#a sample buffer#>;
 
CMAttachmentMode attachmentMode;
CFURLRef url = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_SampleReferenceURL, &attachmentMode);
if (url)
{
    // Do something interesting with the URL.
}
 
CFNumberRef byteoffset = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_SampleReferenceByteOffset, &attachmentMode);
if (byteoffset)
{
    // Do something interesting with the byte offset.
}

Больше информации о демонстрационных буферах, описывающих демонстрационные ссылки, может быть найдено в CMSampleBuffer документация. CMSampleBufferдля созданный этим способом можно быть предоставлены AVAssetWriterInput записать демонстрационные ссылки на новые файлы ролика.  

Новое AVAssetWriterInput свойство, sampleReferenceBaseURL, позволяет Вам указать базовый URL, относительно которого демонстрационный ссылочный URLs должен быть переписан, чтобы быть. Когда добавление демонстрационных ссылок будет относительно этого URL, если значение этого свойства может быть разрешено как абсолютный URL, демонстрационные расположения, записанные в файл. URL должен указать на расположение, которое находится в каталоге, который является родителем демонстрационного ссылочного расположения. Например, установка sampleReferenceBaseURL свойство к «file:///User/johnappleseed/Movies/» и добавляющий выборку буферизует с kCMSampleBufferAttachmentKey_SampleReferenceURL присоединяемый набор к «file:///User/johnappleseed/Movies/data/movie1 .mov» заставит демонстрационную ссылку «data/movie1.mov» быть записанной в фильм.

Посмотрите AVAssetReaderOutput.h, AVAssetWriterInput.h и CMSampleBuffer.h для получения дополнительной информации.

Фрагментированная поддержка фильма

AVFoundation's AVCaptureMovieFileOutput и AVAssetWriter Поддержка APIs, пишущий фрагментировала файлы ролика. Такие файлы имеют регулярный заголовок фильма около начала, описывающего некоторый начальный период данных носителей, сопровождаемых «фрагментами», состоящими из периода данных носителей и затем «фрагмента фильма» описание что дополнительные данные. Этот подход обеспечивает упругость катастрофического отказа, с тех пор даже если запись файла останавливается резко, только новый фрагмент может быть потерян.  

Новое AVAsset подкласс, AVFragmentedMovie, знает о присутствии фрагментов фильма и сопутствующем классе, AVFragmentedMovieMinder, может использоваться, чтобы запросить, чтобы AVFoundation периодически исследовали файл ролика, чтобы видеть, было ли добавлено больше фрагментов фильма. Если они имеют, они включены в AVAsset и недавно добавленные данные носителей могут сразу играться, не будучи должен закрыться и вновь открыться AVAsset. См. AVMovie.h для получения дополнительной информации.

Позволять писать фрагментированного использования файлов ролика AVCaptureMovieFileOutput или AVAssetWriter, укажите время для протекания между записью значения фрагментов фильма для movieFragmentInterval свойство на этих классах (значение по умолчанию kCMTimeInvalid, что означает, что фрагменты фильма не должны использоваться).

В OS X Yosemite, QuickTime Player X использования эти новые службы, поэтому при открытии фрагментированного файла ролика, в то время как это получается другим процессом или компьютером, Вы будете видеть, что его продолжительность периодически увеличивается, и можно вычистить в и играть части фильма, еще не полученного, когда Вы сначала открыли его.

Потоковая поддержка формата файла DV

Поддержка воспроизведения потоковых файлов DV теперь непосредственно интегрируется в поток операций AVFoundation/CoreMedia на OS X Yosemite.

Несжатая поддержка фильма

Несжатые форматы фильма, теперь поддерживаемые на OS X Yosemite, включают:



История версии документа


ДатаПримечания
01.12.2014

Новый документ, описывающий Основу AV APIs в OS X Yosemite для профессиональных видео потоков операций.