다음을 통해 공유


스트림의 위치 지정

AVIFile은 데이터 스트림의 위치를 찾아서 이동하는 여러 가지 방법을 제공합니다. 이 섹션의 함수 및 매크로를 사용하면 애플리케이션이 스트림 내에서 시작 위치, 길이 및 키 프레임(샘플에 전체 이미지를 포함)을 찾을 수 있습니다. 또한 함수 및 매크로는 스트림을 처음부터 스트림의 모든 지점으로 재생하는 데 필요한 경과 시간을 계산하여 스트림의 위치와 시간을 연결합니다.

시작 위치 찾기

AVIStreamStart 함수를 사용하여 비디오 스트림에서 첫 번째 프레임의 샘플 번호를 검색할 수 있습니다. (동영상 프레임은 작성자의 기본 설정에 따라 샘플 0 또는 1에서 시작될 수 있습니다.) AVIStreamInfo 함수를 사용하여 이 정보를 가져올 수도 있습니다. 이 함수는 AVISTREAMINFO 구조체의 dwStart 멤버에 샘플 번호를 저장합니다. AVIStreamStartTime 매크로를 사용하여 스트림의 첫 번째 샘플 시작 시간을 검색할 수 있습니다.

AVIStreamLength 함수를 사용하여 스트림 길이를 검색할 수 있습니다. 이 함수는 스트림의 샘플 수를 반환합니다. AVIStreamInfo 함수를 사용하여 이 정보를 가져올 수도 있습니다. 이 함수는 스트림 길이를 AVISTREAMINFO 구조체의 dwLength 멤버에 저장합니다. 스트림의 길이를 밀리초 단위로 검색하려면 AVIStreamLengthTime 매크로를 사용합니다.

비디오 스트림에서 각 샘플은 일반적으로 비디오 프레임에 해당합니다. 그러나 비디오 데이터가 없는 샘플이 있을 수 있습니다. 이러한 위치 중 하나를 지정하는 AVIStreamRead 함수를 호출하면 데이터 길이가 0바이트로 반환됩니다. AVIStreamFindSample 함수를 사용하고 FIND_ANY 플래그를 지정하여 데이터가 포함된 샘플을 찾을 수 있습니다.

오디오 스트림에서 각 샘플은 오디오 데이터의 하나의 데이터 블록에 해당합니다. 예를 들어 오디오 데이터에 22kHz ADPCM(적응 차등 펄스 코드 변조) 형식이 있는 경우 AVIStreamLength 의 각 샘플은 압축된 오디오 데이터의 256바이트 블록에 해당합니다. 이 오디오 데이터 블록에는 압축을 풀면 약 500개의 오디오 샘플이 포함됩니다. 그러나 AVIFile의 함수 및 매크로는 각 256바이트 블록을 단일 샘플로 처리합니다.

참고

스트림 시작점과 해당 길이의 합계인 스트림의 시작부터 끝까지 스트림 범위 내에서 유효한 위치입니다. 시작 위치와 길이의 합계로 표시되는 위치는 마지막 데이터가 렌더링된 후의 시간에 해당합니다. 데이터가 포함되지 않습니다. AVIStreamEnd 매크로를 사용하여 스트림의 끝을 나타내는 샘플 번호를 검색할 수 있습니다. AVIStreamEndTime 매크로를 사용하여 스트림의 끝을 나타내는 시간 값을 밀리초 단위로 검색할 수 있습니다.

 

샘플 및 키 프레임 찾기

AVIStreamFindSample 함수를 사용하여 스트림에서 다양한 유형의 샘플을 검색할 수 있습니다. 이 함수는 지정한 샘플 번호부터 시작하여 스트림을 통해 뒤로 또는 앞으로 검색하여 적절한 형식의 샘플을 검색합니다. AVIStreamFindSample 호출 시퀀스에서 플래그를 지정하여 스트림에서 다양한 유형의 샘플을 검색할 수 있습니다. FIND_ANY 플래그를 지정하여 흠 없는 샘플을 찾거나 데이터가 없는 샘플을 건너뜁니다. FIND_KEY 플래그를 지정하여 이전 프레임을 참조할 필요 없이 전체 이미지를 렌더링할 데이터가 포함된 키 프레임을 검색합니다. FIND_FORMAT 플래그를 지정하여 형식의 변경 내용을 검색합니다. AVIStreamFindSample 은 주로 비디오 스트림과 함께 사용됩니다.

AVIFile 함수를 사용하는 여러 매크로는 스트림 검색 기능을 보완합니다. 다음 목록에서는 각 매크로에 대한 간략한 설명을 제공합니다. 특정 위치 또는 데이터 형식을 검색하는 매크로는 스트림에서 시작 위치를 지정해야 합니다.

매크로 Description
AVIStreamIsKeyFrame 지정된 스트림의 샘플이 키 프레임인지 여부를 나타냅니다.
AVIStreamNearestKeyFrame 스트림에서 지정된 위치 또는 앞에 있는 키 프레임을 찾습니다.
AVIStreamNearestKeyFrameTime 스트림에서 지정된 시간에 가장 가까운(또는 이전) 키 프레임의 시작 부분에 해당하는 시간을 결정합니다.
AVIStreamNearestSample 스트림에서 지정된 위치 또는 앞에 있는 가장 가까운 흠 없는 샘플을 찾습니다.
AVIStreamNearestSampleTime 스트림에서 지정된 시간에 가장 가까운 샘플의 시작 부분에 해당하는 시간을 결정합니다.
AVIStreamNextKeyFrame 스트림에서 지정된 위치에 따라 다음 키 프레임을 찾습니다.
AVIStreamNextKeyFrameTime 지정된 시간부터 스트림의 다음 키 프레임 시간을 반환합니다.
AVIStreamNextSample 스트림의 지정된 위치에서 다음 흠 없는 샘플을 찾습니다.
AVIStreamNextSampleTime 샘플이 스트림의 다음 샘플로 변경되는 시간을 반환합니다.
AVIStreamPrevKeyFrame 스트림에서 지정된 위치 앞에 있는 키 프레임을 찾습니다.
AVIStreamPrevKeyFrameTime 지정된 시간부터 스트림에서 이전 키 프레임의 시간을 반환합니다.
AVIStreamPrevSample 스트림에서 지정된 위치 앞에 오는 흠 없는 샘플을 찾습니다.
AVIStreamPrevSampleTime 이전 샘플이 스트림에서 선행 샘플을 대체하는 시간을 결정합니다.
AVIStreamSampleToSample 두 번째 스트림에서 발생하는 샘플과 동시에 발생하는 스트림의 샘플을 반환합니다.

 

샘플과 시간 간 전환

AVIStreamSampleToTime 함수를 사용하여 스트림 시작부터 샘플까지 경과된 시간을 확인할 수 있습니다. 이 함수는 샘플 번호를 밀리초 단위로 표현된 시간 값으로 변환합니다. 비디오 프레임(몇 밀리초)의 경우 이 값은 재생이 시작된 이후 샘플이 재생되기 시작한 시간을 나타내며 비디오 클립이 정상 속도로 재생된다고 가정합니다. 오디오 샘플(몇 개의 샘플이 밀리초)의 경우 시간 값은 샘플이 재생되기 시작하고 오디오 스트림이 정상 속도로 재생된다고 가정하는 시간에 해당합니다.

반대로 AVIStreamTimeToSample 함수를 사용하여 시간 값과 연결된 샘플 번호를 찾을 수 있습니다. 이 함수는 밀리초 값을 샘플 숫자로 변환하고 비디오 클립이 정상 속도로 재생된다고 가정합니다.

AVIStreamSampleToTime은 프레임이 재생되기 시작하는 시간을 반환하기 때문에 AVIStreamSampleToTimeAVIStreamTimeToSample 간의 관계는 실제로 반전되지 않습니다. 파일의 위치는 시간을 결정하는 것보다 더 신속하게 결정합니다. 예를 들어 두 개의 연속 오디오 샘플이 모두 동일한 밀리초 단위로 재생될 수 있습니다. AVIStreamSampleToTime을 사용하여 샘플 번호를 변환하면 동일한 시간 값이 발생합니다. AVIStreamTimeToSample을 사용하여 시간 값을 다시 샘플 숫자로 변환하는 경우 단일 샘플이 참조됩니다.