ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WWDC20] AVAssetWriter fmp4writer 소스 분석
    iOS Swift 2023. 6. 9. 11:20

    코드 리뷰

     

    이 문서는 WWDC20 Author fragmented MPEG-4 content with AVAssetWriter 세션의 샘플 예제에 대한 코드를 리뷰합니다. 

    여기서는 해당 프로그램의 구조를 먼저 살펴보겠습니다. 

    Overview

    해당 예제는 기본적으로 Combine 을 이용해 파이프라인 형태의 구조를 채택하고 있습니다.

    Segment Generator는 ReaderWriter에서  세그먼트를 만들어 send(_)를 통해 해당 세그먼트를 퍼블리시합니다. 해당 세그먼트는 Segment File Writer에서 세그먼트를 수신할 때마다 해당 세그먼트를 설정된 출력 디렉토리에 세그먼트 파일을 생성합니다. 그 와 함꼐 Reduce 에서 세그먼트와 함께 수신된 AVAssetSegmentReport를 통해서 해당 세그먼트에 대한 정보를 추가해 가고 성공적으로 모든 세그먼트를 생성한 경우 SegmentGenerator는 send(completion: .finished) 을 호출해 퍼플리싱이 완료됨을 Subscribers.Completion을 통해 전달하게되는 데 이때 Reduce는 지금까지 추가한 정보 IndexFileWriter에 전달되는 데 이를 prog_index.m3u8 파일에 쓰고 프로세스를 종료합니다. 

     

    FM4WriterConfiguration

    FM4WriterConfiguration은 프로그램 전체에서 사용하는 설정값들을 관리하는 객체로 입력 파일, 출력 폴더, Asset Reader, Asset Writer에 대한 설정이 포함되어 있습니다.

     

    여기서 사용하는 파라미터의 내용을 간단하게 살펴보겠습니다. 

    • segmentDuration : 세그먼트 파일을 생성할 시간 간격 (여기서는 6초로 설정) 
    • startTimeOffset: 오디오 프라이밍(Priming) 으로 인한 오디오 / 비디오 비동기 값을 처리하기 위한 시작 시간 Offset
    • minimumAllowableSourceFrameDuration: 소스의 최소 가능 프레임레이트 60fps로 설정되어 있음
    • outputContentType:  출력할 컨텐츠 타입 
    • outputContentTypeProfile: 출력할 파일이 지원할 프로파일. HLS 지원을 위해 .mpeg4AppleHLS로 설정 
    • audioCompression: Asset Writer의 오디오 입력에 인코더 설정
    • videoCompression: Asset Write의 비디오 읿력에 대한 인코더 설정 

    SourceMedia

    입력 파일의 에셋과 오디오 비디오 트랙을 위한 구조체로 loadTracks 함수에서 입력 파일을 읽어와 생성합니다.  해당 SourceMedia는  generateSegment<S> 생성 시 ReadWriter의 초기화 시 ReaderWriter에 전달됩니다. 

     

     

     

    ReadWriter

    ReaderWriter는 init(sourceMedia:configuration:subect)에서 입력된 소스미디어와 설정 값을 이용해 Segment들을 생성하고 생성된 Segment는 subject를 통해 파이프라인을 통해 해당 세그먼트를 전달하는 역할을 합니다. 이 객체는 generateSegments<S>(sourceMedia:configuration:subject) 함수를 통해 이루어 집니다. 

    Segment

    segment에는  ReaderWriter의 AVAssetWriterDelegate의 delegate 함수 assetWriter(_:didOutputSegmentData:segmentType:segmentReport) 내에서 생성되고 퍼블리쉬 됩니다. 

     

    호출 시퀀스 

     

    이 프로그램은 loadTracks 함수를 호출해 SourceMedia를 생성, ReadWriter에 등록된 Subject를 통해 퍼블리쉬될 Segment를 받아 이를 처리할 Combine 객체의 파이프라인을 연결, generatateSegment()를 호출 의 세단계 로 이루어집니다. generateSegment를 호출하면 ReaderWriter 객체를 생성하고 start() 함수를 호출합니다. 이제 ReaderWriter는 모든 세그먼트를 생성해 데이터와 세그먼트 정보를 전달하게 되고 파이프라인에 연결된 Combine 객체들이 이를 처리해 파일을 생성하게 됩니다. 

     

    여기서는 해당 예제의 전체 구조를 알아보았습니다. 다음에는 실제 ReaderWriter를 분석하여 어떻게 입력으로 들어온 파일을 실제 Fragment MP4 형식으로 변환하는지에 대해 살펴보겠습니다. 

    댓글

Designed by Tistory.