2012-10-21 5 views
4

디스크에서 미디어 데이터를 읽고 적절한 픽셀 형식으로 변환 한 다음 압축하여 디스크에 기록하기 위해 AVAssetWriter에 전달하는 응용 프로그램을 만들고 있습니다. 나는 내 자신의 독서를 인터리브하고 AVAssetReader를 사용하지 않고있다. 독자는 정확히 한 프레임 상당의 비디오 데이터와 한 프레임 상당의 오디오 데이터를 연속 방식으로 제공합니다. 내가 겪고있는 문제는 만약 expectsMediaDataInRealTime 속성을 YES으로 설정하지 않으면 비디오 자산 제작자는 정확하게 30 프레임 후에 isReadyForMoreMediaData에 대해 NO을 반환 할 것입니다. 30 프레임 전에 쓰기를 멈 추면 제대로 작동하고 출력 파일이 유효합니다. 그러나 expectsMediaDataInRealTime을 YES로 설정하면 전체 기간 동안 완벽하게 작동하며 수천 프레임이 될 수 있습니다. expectsMediaDataInRealTime을 YES로 설정하여 트랜스 코드 작업을 시작한 후에 매우 긴 비디오를 압축하는 동안 앱의 메모리 사용량을 보았으며 불합리한 메모리 사용이나 메모리 누수가 없었습니다. 그리고 결과로 생성 된 MOV 파일은 상당히 정상적으로 작성된 것 같습니다. 오디오 데이터는 예상했던대로 비디오 데이터와 인터리브되었다.AVFoundation의 AVAssetWriterInput expectsMediaDataInRealTime 속성은 정확히 무엇을합니까?

그래서 YES로 설정하는 데 명백한 단점이 없다면 expectsMediaDataInRealTime을 NO로 설정하는 이유는 무엇입니까? Apple API를 사용하여 데이터를 읽을 때만 적용됩니까 (AVAssetReader 사용)? 설명서에서는이 속성이 "저장 및 재생 효율성을 위해 이상적인 인터리빙 패턴으로 미디어 데이터 쓰기"를 제어하지만 expectsMediaDataInRealTime이 YES로 설정된 경우 isReadyForMoreMediaData는 NO를 반환하지 않으며 파일이 완벽하게 작성된 것으로 보입니다. 따라서이 속성이 YES로 설정된 경우 AVAssetWriter가이 작업을 수행 할 수있는 경우 NO로 설정하면 AVAsetWriter가이 작업을 수행 할 수없는 이유는 무엇입니까? 소스는 정확히 동일합니다.

정확하게이 속성은 "readyForMoreMediaData의 값이 적절하게 계산되었는지 확인하십시오"(즉, 나에게 전혀 의미가 없음) 이외의 기능입니까?

답변

0

expectsMediaDataInRealTime을 YES로 설정하면 인코더가 카메라와 같은 실시간 데이터 스트림 피드를 기다리고 있음을 의미합니다.이 경우 인코더에 데이터가 지속적으로 공급되므로 isReadyForMoreMediaData는 데이터를 인코더로 공급할 수 있습니다. isReadyForMoreMediaData가 NO 인 경우 현재 샘플을 삭제하고 다음 샘플이 도착할 때까지 기다린 후 isReadyForMoreMediaData를 다시 확인해야합니다.

expectsMediaDataInRealTime이 NO 인 경우 엔코더가 실시간 소스가 아니라 오프라인 데이터 스트림 (예 : AVAssetReader)을 사용하고 있음을 의미합니다. 이 경우 흐름 속도를 직접 제어 할 수 있으므로 isReadyForMoreMediaData가 NO이면 입력 및 인코더를 잡고 isReadyForMoreMediaData가 YES가 될 때까지 대기 할 수 있습니다 (예 : 무한 루프를 사용하여 절전 모드로 전환하고 isReadyForMoreMediaData 변경 등).

내부 메커니즘이 가능한 한 정렬 된 오디오 및 비디오 타임 스탬프를 삽입하려고 시도하기 때문에 플레이어가 많은 데이터를 미리 가져 와서 재생할 수는 없습니다. 데이터 소스 최종 데이터 무결성과 재생 측면 경험 간의 절충안입니다. 하지만 항상 expectsMediaDataInRealTime을 사용할 수 있다고 가정 하긴하지만 isReadyForMoreMediaData == NO 인 경우 초기 피드 샘플을 삭제하는 것이 좋습니다.

관련 문제