NB Frames는 비디오 또는 오디오 파일의 한 스트림에 포함된 프레임 수를 의미합니다. NB는 "number"의 약자입니다. FFmpeg과 그 ffprobe 프로그램은 이 필드를 nb_frames라고 부릅니다.
하나의 파일에는 여러 개의 스트림이 있을 수 있으며, 각 스트림은 고유한 NB Frames 값을 가집니다. 따라서 하나의 비디오 스트림과 하나의 오디오 스트림이 있는 파일에는 각각 따로 계산된 2개의 값이 있습니다. NB Streams는 다른 값으로, 스트림 안의 프레임이 아니라 파일 안의 스트림 개수를 셉니다.
프레임이란 무엇입니까
비디오 스트림에서 프레임은 비디오의 정지 이미지 한 장입니다. 오디오 스트림에서는 그 의미가 형식에 따라 달라집니다.
AIFF에서 샘플 프레임은 각 오디오 채널당 하나의 샘플을 포함합니다. MP3에서 프레임은 더 큰 블록이며, FFmpeg은 프레임 수에 프레임당 샘플 수를 곱해 길이를 계산합니다. 따라서 한 형식에서 얻은 오디오 프레임 수를 다른 형식의 프레임 수와 직접 비교할 수 없습니다.
값이 어떻게 표시되는지
값이 알려져 있을 때는 항상 정수입니다. 다음 값들은 FFmpeg의 코드, 문서, 테스트 결과에 나타납니다.
708: FFmpeg의 테스트 파일 중 하나에 있는 비디오 스트림의 프레임 수입니다.1: HEIC 파일에서 단일 정지 이미지의 프레임 수입니다.0: 개수를 알 수 없을 때 FFmpeg의 프로그래밍 인터페이스가 사용하는 값입니다.N/A: 값이 0일 때 ffprobe의 기본 출력에 표시되는 텍스트입니다. JSON 및 XML 출력에서는 이 필드를 생략합니다.
0 또는 N/A 값이거나 필드가 없는 경우라도, 스트림이 비어 있다는 뜻은 아닙니다. 이 값은 단지 FFmpeg이 이 필드에 프레임 수를 설정하지 않았다는 것만 알려 줍니다.
값이 어디에서 오는지
NB Frames는 보통 파일 자체의 구조에서 가져오기 때문에, FFmpeg이 직접 프레임을 세지 않아도 됩니다. 출처는 형식에 따라 달라집니다.
- MP4 및 MOV: FFmpeg은
sttsatom인 time-to-sample 테이블의 샘플 수를 모두 합산합니다. - AVI: FFmpeg은 스트림 헤더의
strh청크에서 32비트 정수를 읽습니다. - AIFF: FFmpeg은 Common Chunk의
numSampleFrames필드를 읽습니다. - WAV, MP3, FLAC, MKV: 이 형식들에 대한 FFmpeg 리더는 이 값을 설정하지 않으므로, ffprobe의 기본 출력은
N/A를 표시합니다.
MKV 파일에는 다른 이름으로 프레임 수가 저장되어 있을 수 있습니다. mkvmerge 프로그램은 각 트랙에 대해 NUMBER_OF_FRAMES라는 태그를 작성합니다.
프레임을 세는 방법
NB Frames는 파일 구조에 저장된 숫자를 그대로 반복할 뿐입니다. 이 숫자가 실제로 모든 프레임이 파일에 들어 있다는 것을 보장하지는 않습니다. FFmpeg의 한 MOV 테스트 파일은 708이라는 프레임 수를 저장하지만, ffprobe는 이 파일에서 66개의 패킷과 65개의 프레임만 읽어 냅니다.
실제 프레임 수를 측정하려면 ffprobe를 -show_streams 및 -count_frames 옵션과 함께 실행하세요. 그러면 ffprobe가 스트림을 디코딩하고 별도 필드인 nb_read_frames에 결과를 보고합니다. 이 방식은 ffprobe가 모든 프레임을 디코딩해야 하므로 더 많은 시간이 걸립니다.
이 검사는 비디오 스트림에 사용하는 것이 좋습니다. AIFF 파일에서는 ffprobe가 많은 샘플 프레임을 포함하는 디코딩된 블록을 세기 때문에, 완전한 파일이라도 두 숫자가 서로 다를 수 있습니다.
-count_packets 옵션은 -show_streams와 함께 사용되며, 패킷을 디코딩하지 않고 개수만 세어 nb_read_packets에 결과를 기록합니다. 비디오 패킷은 보통 압축된 프레임 하나를 포함하지만, 오디오 패킷에는 여러 프레임이 들어 있을 수 있습니다.
왜 중요한지
비디오 스트림에서 프레임 수와 재생 시간을 함께 사용하면 평균 프레임 레이트를 구할 수 있습니다. FFmpeg의 MP4 및 MOV 리더는 프레임 수와 재생 시간에서 이 값을 계산합니다. 같은 테스트 파일에서 23.613333초 동안 708프레임이면 초당 약 29.98프레임이 됩니다.
이 값은 비디오 파일을 점검할 때도 유용합니다. 측정된 프레임 수가 저장된 프레임 수보다 크게 작다면, 비디오 데이터 일부가 손실되었을 수 있습니다.