Skip to main content
Orux AIOruxAI

Orux AI / 모델 노트

Kling v3 영상 프레임 검사: 5초 구간의 인제스트 계획

기존 Kling v3 영상의 24 fps·121프레임·5.041667초를 확인합니다. Python으로 전체 타임스탬프 CSV와 120프레임 편집안을 만들고 실제 편집·과거 과금과 구분합니다.

Orux AI게시 17 분 읽기
Kling v3 영상 프레임 검사: 5초 구간의 인제스트 계획 — 기존 Kling v3 영상의 24 fps·121프레임·5.041667초를 확인합니다.
목차

5초 편집 구간을 확정하기 전에 디코딩한 프레임을 확인하세요

Kling v3 클립을 24 fps 타임라인의 정확히 120프레임인 구간에 배치하려면, 5초로 요청했다는 정보만으로는 부족합니다. 실제 전달된 파일을 확인하세요. 여기서 분석한 Orux의 기존 하모니카 리드 사례는 요청 길이가 5초지만, 저장된 MP4에는 24 fps로 디코딩되는 영상 프레임 121개가 있으며, 보고된 길이는 5.041667초입니다. 이는 편집 과정에서 판단할 경계 문제이며, 그 자체로 생성 실패나 잘못된 청구의 증거는 아닙니다.

기계의 세부 동작을 보여 주는 인서트를 편집하는 사람에게 필요한 결과물은 프레임 번호가 붙은 인제스트 보고서입니다. 아래 Python 예제는 전체 타임스탬프 CSV와 편집 제안서를 만듭니다. 5초 구간에는 0부터 세는 프레임 0–119를 유지하고, 프레임 120은 별도로 검토하자는 계획입니다. 동영상을 수정하거나 내보내지는 않습니다. 아래에 원본도 제공하므로 타이밍과 함께 실제 보이는 동작도 판단할 수 있습니다.

실제 프레임 72, 시각 3.000초. 저장된 Kling v3 클립에서 핀셋이 구리 리드에 접촉한 장면.
실제 프레임 72, 시각 3.000초. 저장된 Kling v3 클립에서 핀셋이 구리 리드에 접촉한 장면.

원본의 실제 프레임 72이며 표시 시각은 3.000000초입니다. 기존 모델 사례에서 추출한 프레임이지, 새로 생성한 이미지가 아닙니다.

실제 Kling v3 사례와 저장된 설정

원본은 Orux Kling v3 모델 페이지의 사례입니다. 저장된 영상은 구리 하모니카 리드에 핀셋이 작용하는 모습을 익스트림 클로즈업으로 보여 줍니다. 원래 프롬프트를 그대로 보존했습니다.

维修者用细镊子轻拨一片铜簧片,簧片短暂振动后静止,超近距单镜头。

독자를 위한 번역: “수리자가 가는 핀셋으로 구리 리드를 가볍게 튕긴다. 리드는 잠깐 진동한 뒤 멈춘다. 익스트림 클로즈업의 단일 샷.” 이는 저장된 입력을 설명하는 번역이며, 새로 생성할 때 사용한 다른 프롬프트가 아닙니다.

저장된 설정은 duration: 5, aspect_ratio: "16:9", mode: "std", sound: "off", kling_v3_type: "t2v"입니다. 이 사례에는 참조 이미지 입력이 기록되어 있지 않습니다. 따라서 이미지-투-비디오에서 원본을 보존하는 능력을 입증한 테스트로 설명하면 안 됩니다. 이 글을 위해 새 모델 요청을 보내지 않았습니다.

저장된 원본 Kling v3 영상: 소리가 꺼진 익스트림 클로즈업에서 핀셋이 구리 하모니카 리드에 접촉하는 장면.

std 모드, 소리 끔, 5초로 요청한 기존 Kling v3 사례입니다. 여기서 검사한 파일은 24 fps에서 121프레임이며, 이 글을 위해 새로 생성한 결과가 아닙니다.

2026년 11월 3일에 확인한 현재 공개 폼은 3–15초 길이, 16:9·9:16·1:1 화면비, std/pro 모드, 소리 켜기/끄기를 제공합니다. 이는 확인한 Orux 연동의 선택 항목입니다. 이 분석은 추가적인 네이티브 모델 제어를 추정하거나, 다른 모드를 고르면 눈에 보이는 동작이 고쳐진다고 주장하지 않습니다.

샘플 프레임 여섯 장이 보여 주는 것과 입증하지 못하는 것

원본은 1,280 × 720이며, 검사한 파일에는 오디오 스트림이 없습니다. 저장된 소리 끔 설정과 일치합니다. 샘플로 확인한 시점들에서는 손가락, 핀셋, 리드를 가까이 잡는 구도가 유지됩니다. 3초 부근에서는 접촉점 주변 리드의 겉모양이 바뀌고, 이후 샘플 프레임에서는 도구가 그 접촉 위치에서 물러나 있습니다.

이 관찰은 편집에서 동작을 어느 위치에 둘지 결정하는 데 유용합니다. 하지만 실제 리드의 진동수를 측정하거나, 기계적 정확성을 증명하거나, 모든 중간 프레임에 결함이 없음을 확인하지는 못합니다. 1초에 한 장을 뽑은 정지 화면으로 빠른 진동 주기를 입증할 수는 없습니다. 단순한 설명용 인서트 이상의 용도로 쓰기 전에 원본 클립을 보고 관련 중간 프레임을 살펴보세요.

원본 프레임 번호(0부터 시작)표시 시각해당 샘플에서의 편집상 관찰
00.000000 s클로즈업 구도와 리드 근처의 손가락·도구를 보여 줌
241.000000 s도구가 리드 근처에 있고 작업 영역이 계속 보임
482.000000 s더 큰 겉모양 변화 이전의 접촉 영역을 확인할 또 하나의 기준 장면
723.000000 s접촉 영역 주변에서 리드가 더 넓어지거나 들린 듯 보임
964.000000 s도구가 3초 시점의 접촉 위치에서 물러나 있음
1205.000000 s마지막 샘플 프레임이 5초 경계에서 시작함

좌우로 밀어 전체 표를 확인하세요.

0·1·2·3·4·5초의 원본 프레임 여섯 장. 각 프레임의 전체 구도를 유지하고 0부터 시작하는 프레임 번호를 붙였다.
0·1·2·3·4·5초의 원본 프레임 여섯 장. 각 프레임의 전체 구도를 유지하고 0부터 시작하는 프레임 번호를 붙였다.

기록된 표시 시각에 해당하는 원본 프레임 0, 24, 48, 72, 96, 120입니다. 각 프레임의 전체 구도를 보여 주며, 라벨과 콘택트 시트 배치는 로컬에서 추가했습니다.

다른 시각적 판단이 필요하다면 Kling 4.0 동일 프롬프트 샷 비교에서 기존 테이크 중 고르는 방법을 볼 수 있습니다. 여기에는 저장된 테이크가 하나뿐이며, 질문은 실제 프레임 타이밍이 편집 구간에 어떻게 맞는가입니다. 두 글 모두 몇 가지 관찰을 모델 전체의 신뢰성 점수로 바꾸지는 않습니다.

마지막 프레임의 타임스탬프와 클립 길이를 구분하세요

정확히 24 fps이면 한 프레임 간격은 1/24초, 약 0.041667초입니다. 5초 구간에는 프레임 간격 120개가 들어갑니다. 0부터 번호를 매기고 원본이 시각 0에서 시작한다면, 각 프레임 시작점은 0, 1/24, 2/24부터 119/24, 즉 4.958333초까지입니다.

다음 프레임인 번호 120은 5.000000초에 시작합니다. 그 프레임도 한 간격 동안 포함하면 121/24, 약 5.041667초가 됩니다. 따라서 파일의 마지막 표시 타임스탬프와 보고된 길이는 서로 모순되지 않으면서 다를 수 있습니다. 일반적으로 반열린 구간 [0, 5)로 나타내는 타임라인 구간은 시작점이 정확히 5초인 프레임을 제외합니다.

이 검사는 평균 프레임레이트 표시에 곱셈만 하고 결과를 믿는 대신 실제 표시 타임스탬프를 확인합니다. 이번 실행에서 반환된 소수점 이하 여섯 자리 타임스탬프 표현을 고려해, 디코딩된 각 시각이 가정한 24 fps 격자에서 2마이크로초 이내에 있는지 검사합니다. 이 허용 오차는 해당 샘플을 파싱하기 위한 검사이며, 지각적 품질 기준은 아닙니다.

가변 프레임레이트 파일이나 23.976 fps 프로젝트에 같은 계산을 그대로 적용하지 마세요. 그 경우에는 다른 타이밍 정책이 필요합니다. 코드는 평균 레이트가 다르거나 타임스탬프 순서가 고정 레이트 가정에 맞지 않으면 의도적으로 거부합니다. 출력은 범위를 좁혀 정의한 인제스트 계획이며, 자동 프레임레이트 변환 도구가 아닙니다.

요청 설정의 예산과 파일 검사를 분리하세요

아래 현재 Orux 요금은 2026년 11월 3일에 확인했습니다. 설정된 환산 기준은 1 Credit = USD 0.005입니다. 각 모드와 소리 설정으로 생성하는 1초당 요금입니다. 5초 열은 새 요청을 계획하기 위한 산술 계산이며, 저장된 이 사례에 과거에 청구된 금액이 아닙니다.

Kling v3 설정현재 Orux 요금 / 초5초 요청 계획액
std, 소리 끔 — 저장된 사례 설정16.00008 Credits (USD 0.0800004)80.0004 Credits (USD 0.400002)
pro, 소리 끔21.33336 Credits (USD 0.1066668)106.6668 Credits (USD 0.533334)
std, 소리 켬24.00024 Credits (USD 0.1200012)120.0012 Credits (USD 0.600006)
pro, 소리 켬32.00016 Credits (USD 0.1600008)160.0008 Credits (USD 0.800004)

좌우로 밀어 전체 표를 확인하세요.

이 글에서는 새로운 생성 요금이 발생하지 않았습니다. 기존 로컬 파일을 검사하고 CSV를 작성하며 어떤 프레임을 유지할지 결정하는 데 모델을 다시 호출할 필요는 없습니다. 프레임 하나를 편집해 없앴다고 환불이 성립하거나 과거 생성 요금이 바뀌는 것도 아닙니다. 원래 사례의 청구 영수증을 사용하지 않았으므로, 5.041667초라는 파일 메타데이터를 실제로 몇 초가 과금되었는지 증명하는 자료로 제시하면 안 됩니다.

새로운 창작 방향이 필요하면 다른 테이크를 요청하기 전에 현재 설정과 계정 견적을 확인하세요. 그 외에는 사용할 만한 결과를 정확한 구간에 맞추는 일만 문제라면 타임라인 결정을 먼저 해결하세요. 연동 세부 사항은 Orux API 문서를 참고하세요. 이 작업은 API 폴링이나 재시도 장치가 아니라 실제로 전달된 파일을 다룹니다.

프레임 검사를 실행하고 원본을 보관하세요

FFmpeg를 설치해 명령줄에서 ffprobe를 사용할 수 있도록 하고, Python 3.9 이상을 사용하세요. 공식 ffprobe 문서는 스트림 검사, 디코딩된 프레임 수 세기, 프레임별 정보를 설명합니다. 프로그램은 로컬 ffprobe 실행 파일 외에는 Python 표준 라이브러리만 사용합니다.

삽입된 플레이어나 모델 페이지에서 기존 영상을 source.mp4로 저장한 뒤 아래 코드를 audit_clip.py로 저장하세요. 쓰기 가능한 디렉터리에서 python3 audit_clip.py source.mp4를 실행합니다. 사이트의 정상적인 영상 접근 경로를 이용하세요. 사이트가 기대하는 요청 맥락 없이 원시 다운로더로 접근하면 CDN에서 거부할 수 있습니다. 프로그램 자체는 미디어를 다운로드하거나 모델 엔드포인트에 접속하지 않으며 API 키도 쓰지 않습니다.

Python
import csv
import hashlib
import json
import subprocess
import sys
from decimal import Decimal
from fractions import Fraction
from pathlib import Path

EXPECTED_SHA = '5c948c89baf54c46c85afe65c33636bebb8a6a79acc22eebcce2412aef3e5515'
SOURCE = Path(sys.argv[1] if len(sys.argv) > 1 else 'source.mp4')
TARGET_RATE = Fraction(24, 1)
TARGET_SECONDS = 5

def probe(*args):
    command = ['ffprobe', '-v', 'error', *args, '-of', 'json', str(SOURCE)]
    return json.loads(subprocess.run(command, check=True, capture_output=True, text=True).stdout)

def audit_timestamps(times, rate):
    if not times or rate <= 0:
        raise ValueError('missing frames or invalid rate')
    origin = times[0]
    for index, timestamp in enumerate(times):
        expected = origin + Decimal(index * rate.denominator) / rate.numerator
        if abs(timestamp - expected) > Decimal('0.000002'):
            raise ValueError('timestamps do not match the assumed constant rate')

def main():
    if hashlib.sha256(SOURCE.read_bytes()).hexdigest() != EXPECTED_SHA:
        raise ValueError('sample changed; inspect the new file before auditing')
    info = probe('-count_frames', '-show_entries',
                 'stream=index,codec_type,width,height,avg_frame_rate,nb_read_frames:format=duration')
    video = next(s for s in info['streams'] if s['codec_type'] == 'video')
    rate = Fraction(video['avg_frame_rate'])
    if rate != TARGET_RATE:
        raise ValueError('this example expects an exact 24 fps source')
    raw = probe('-select_streams', 'v:0', '-show_frames', '-show_entries',
                'frame=best_effort_timestamp_time')['frames']
    times = [Decimal(row['best_effort_timestamp_time']) for row in raw]
    audit_timestamps(times, rate)
    if int(video['nb_read_frames']) != len(times):
        raise ValueError('decoded frame counts disagree')
    target_count = TARGET_SECONDS * TARGET_RATE.numerator // TARGET_RATE.denominator
    if len(times) < target_count:
        raise ValueError('source is shorter than the target slot')
    with Path('frame-times.csv').open('w', newline='') as handle:
        writer = csv.writer(handle)
        writer.writerow(['zero_based_frame', 'presentation_seconds'])
        writer.writerows((i, str(t)) for i, t in enumerate(times))
    plan = {
        'width': video['width'], 'height': video['height'],
        'source_rate': str(rate), 'decoded_frames': len(times),
        'container_seconds': info['format']['duration'],
        'last_presentation_seconds': str(times[-1]),
        'audio_streams': sum(s['codec_type'] == 'audio' for s in info['streams']),
        'target_frames': target_count, 'keep_frames_inclusive': [0, target_count - 1],
        'last_kept_presentation_seconds': str(times[target_count - 1]),
        'frames_outside_slot': len(times) - target_count,
        'edit_applied': False,
    }
    Path('edit-plan.json').write_text(json.dumps(plan, indent=2) + '\n')
    print(json.dumps(plan, indent=2))

if __name__ == '__main__':
    main()

실행 결과는 decoded_frames: 121, target_frames: 120, keep_frames_inclusive: [0, 119], frames_outside_slot: 1, last_kept_presentation_seconds: "4.958333", edit_applied: false로 보고되었습니다. 생성된 CSV에는 헤더 외에 데이터 행 121개가 있습니다. 보고서는 1,280 × 720 크기와 오디오 스트림 0개도 기록합니다.

원본 MP4, 해시, 타임스탬프 CSV, 편집 제안서를 함께 보관하세요. 고정한 해시는 이 재현용 예제를 검사한 파일로 의도적으로 한정합니다. 재사용 권한이 있는 다른 원본이라면 파일을 검사하고 예상 해시와 타이밍 가정을 명시적으로 수정해야 합니다. 통과시키기 위해 검사를 제거하지 마세요. 이 코드는 프레임별 메타데이터를 메모리에 읽으며, 짧은 클립을 위한 설계이지 장편 미디어 아카이브용은 아닙니다.

편집 결정을 명시적으로 내리세요

이 샘플에는 합리적인 선택이 두 가지 있습니다. 주변 시퀀스에 약 5.041667초를 넣을 여유가 있다면 121프레임 원본 전체를 유지할 수 있고, 정확히 120프레임인 구간이 필요하다면 프레임 0–119를 제안할 수 있습니다. 여기서는 후자의 계획을 만들었습니다. 잘라낸 내보내기 파일은 제공하지 않았으며, 제공했다고 주장하지도 않습니다.

편집기에서 이 계획을 적용하기 전에 원본 프레임 119와 120, 그 주변의 전체 동작을 살펴보세요. 선택한 아웃점이 의미 있는 마지막 자세를 없애거나, 의도치 않은 점프를 만들거나, 인접 샷과 충돌하지 않는지 확인합니다. 프로젝트에서 동작이 멈춘 상태를 더 길게 보여 줘야 한다면, 기존의 5초 구간 자체가 적절하지 않은 창작 제약일 수 있습니다. 프레임 수 검사가 그 예술적 판단을 대신할 수는 없습니다.

자신의 작업 과정에서 편집하거나 내보낸 뒤에는 새 파일을 다시 검사하세요. 원본 보고서가 나중에 내보낸 파일의 타이밍, 오디오, 이미지 품질을 인증하지는 않습니다. 여기서 얻는 실용적인 결과는 검사 가능한 인계 자료입니다. 확인된 원본, 측정한 타임스탬프, 명확히 제안한 프레임 범위를 갖추고, 창작 검토·타임라인 길이·생성 비용을 분리합니다.

FAQ

5초로 요청하면 항상 121프레임이 반환되나요?

이 글은 일반적인 규칙을 입증하지 않습니다. 저장된 이 Kling v3 파일에는 24 fps로 디코딩된 프레임 121개가 있습니다. 이 샘플의 경계 동작을 모델 전체의 보장으로 취급하지 말고, 전달받은 각 파일을 확인하세요.

이 예제의 정확한 5초 구간에는 어떤 프레임이 들어가나요?

명시한 24 fps, 120프레임 구간에는 프레임 0부터 119까지 들어갑니다. 프레임 119는 4.958333초에, 프레임 120은 5.000000초에 시작하므로 후자는 [0, 5) 밖에 있습니다. 코드는 편집을 적용하지 않고 이 범위를 제안합니다.

추가 프레임이 추가 시간 과금의 증거인가요?

아닙니다. 파일 길이만으로는 과금 기준이나 과거 청구액을 확인할 수 없습니다. 가격표는 특정 날짜에 확인한 요청 설정에 따른 계획 계산이며, 저장된 사례의 청구 영수증은 확인하지 않았습니다.

콘택트 시트로 리드가 올바르게 진동한다고 증명할 수 있나요?

아닙니다. 선택된 시점의 모양과 도구 위치를 보여 줄 뿐, 측정된 물리적 진동을 보여 주지는 않습니다. 편집에 적합한지는 원래 동작을 보고 판단하고, 이 생성 영상을 기계적 정확성의 증거로 사용하지 마세요.

검사 과정에서 영상을 생성하거나 수정했나요?

아닙니다. 기존 MP4를 검사하고 타임스탬프 CSV와 편집 제안 JSON을 작성했습니다. 유료 모델 호출을 하지 않았으며 잘라낸 내보내기 파일, 프레임레이트 변환, 새 사운드트랙도 제공하지 않았습니다.

Orux AI에서 Orux Kling v3 모델 페이지 사용해 보기모델 페이지에서 온라인으로 실행하고 가격과 API 예시를 확인하세요.모델 열기

하나의 API로 이 모델들을 사용하세요

채팅·이미지·비디오·오디오 모델을 지원하는 OpenAI 호환 API이며 Credits로 과금됩니다.