Từ điển

NB Frames có nghĩa là gì?

NB Frames cho bạn biết một luồng video hoặc âm thanh có bao nhiêu frame. FFmpeg không báo cáo con số này cho mọi định dạng, vì vậy giá trị có thể không xác định.

nb-frames

NB Frames nghĩa là số lượng khung hình (frame) trong một luồng (stream) của tệp video hoặc audio. Chữ NB là viết tắt của "number". FFmpeg và chương trình ffprobe của nó gọi trường này là nb_frames.

Một tệp có thể chứa nhiều luồng, và mỗi luồng có giá trị NB Frames riêng. Vì vậy, một tệp có một luồng video và một luồng audio sẽ có 2 số đếm riêng. NB Streams là một giá trị khác: nó đếm số luồng trong tệp, không phải số khung hình bên trong một luồng.

Frame là gì

Trong một luồng video, một frame là một ảnh tĩnh của video. Trong một luồng audio, ý nghĩa phụ thuộc vào định dạng.

Trong AIFF, một sample frame chứa một mẫu cho mỗi kênh audio. Trong MP3, một frame là một khối lớn hơn, và FFmpeg nhân số frame với số mẫu trên mỗi frame để ra độ dài. Vì vậy bạn không thể so sánh trực tiếp số lượng audio của định dạng này với số lượng của định dạng khác.

Giá trị trông như thế nào

Giá trị là một số nguyên khi nó được biết. Các giá trị sau xuất hiện trong mã nguồn, tài liệu và kết quả kiểm thử của FFmpeg:

  • 708: số đếm cho một luồng video trong một tệp kiểm thử của FFmpeg.
  • 1: số đếm cho một ảnh tĩnh đơn trong một tệp HEIC.
  • 0: giá trị mà giao diện lập trình của FFmpeg dùng khi số lượng không được biết.
  • N/A: văn bản mà đầu ra mặc định của ffprobe in ra khi giá trị là 0. Đầu ra JSON và XML của nó sẽ bỏ qua trường này.

Giá trị 0 hoặc N/A, hoặc thiếu trường, không cho bạn biết luồng đó rỗng. Giá trị chỉ cho bạn biết FFmpeg không thiết lập số đếm trong trường này.

Giá trị đến từ đâu

NB Frames thường lấy từ chính cấu trúc của tệp, nên FFmpeg không phải tự đếm frame. Nguồn gốc phụ thuộc vào định dạng:

  • MP4 và MOV: FFmpeg cộng các số lượng mẫu trong bảng time-to-sample, là atom stts.
  • AVI: FFmpeg đọc một số 32-bit từ header của luồng, là chunk strh.
  • AIFF: FFmpeg đọc trường numSampleFrames từ Common Chunk.
  • WAV, MP3, FLAC và MKV: các trình đọc của FFmpeg cho các định dạng này không thiết lập giá trị, nên đầu ra mặc định của ffprobe sẽ in N/A.

Một tệp MKV vẫn có thể chứa số đếm này dưới tên khác. Chương trình mkvmerge ghi một thẻ tên là NUMBER_OF_FRAMES cho mỗi track.

Cách đếm frame

NB Frames chỉ lặp lại con số có trong cấu trúc tệp. Con số đó không chứng minh được rằng tất cả frame thực sự có trong tệp. Một tệp MOV kiểm thử trong FFmpeg lưu số đếm 708, nhưng ffprobe chỉ đọc được 66 gói (packet) và 65 frame từ tệp đó.

Để đo số đếm, hãy chạy ffprobe với tùy chọn -show_streams và -count_frames. Khi đó ffprobe sẽ giải mã luồng và báo cáo kết quả trong một trường riêng, nb_read_frames. Việc này mất nhiều thời gian hơn vì ffprobe phải giải mã từng frame.

Hãy dùng cách kiểm tra này cho các luồng video. Trong một tệp AIFF, ffprobe đếm các khối đã giải mã, mỗi khối chứa nhiều sample frame, nên hai con số sẽ khác nhau ngay cả khi tệp hoàn chỉnh.

Tùy chọn -count_packets, cũng được dùng với -show_streams, đếm packet mà không giải mã và báo cáo kết quả trong nb_read_packets. Một packet video thường chứa một frame nén, nhưng một packet audio có thể chứa nhiều frame.

Tại sao nó quan trọng

Với một luồng video, số lượng frame cùng với thời lượng sẽ cho ra tốc độ khung hình trung bình. Trình đọc MP4 và MOV của FFmpeg tính tốc độ này từ số frame và thời lượng. Trong cùng tệp kiểm thử đó, 708 frame trong 23,613333 giây cho ra khoảng 29,98 frame mỗi giây.

Số đếm cũng giúp bạn kiểm tra tệp video. Nếu số đo được thấp hơn rất nhiều so với số lưu trong tệp, có thể một phần dữ liệu video đã bị thiếu.