Huny's Dev Blog
huny.dev

PPTX 영상·오디오 내장 검증: 포스터·링크·실제 재생을 구분하기

발표 자료 자동화에서 미디어 파일 존재, 슬라이드 관계, 실제 재생을 나누어 검증한다. Python으로 내부·외부·누락 관계를 점검하고 테스트의 한계를 구분한다.

Hun Jang
Hun Jang Nov 15, 2026

프레젠테이션 안에 영상과 음원이 들어 있는 상태를 표현한 AI 생성 개념 이미지. 실제 PowerPoint 화면이 아니다.

발표 자료에 재생 버튼이 보인다고 영상이 들어 있는 것은 아니다. 포스터 이미지에 링크만 걸려 있을 수도 있고, 파일은 내장됐지만 재생 설정이나 코덱 문제로 움직이지 않을 수도 있다.

개발자가 PPTX를 자동 생성한다면 검증을 세 단계로 나누는 편이 안전하다. 패키지 안의 미디어 존재, 슬라이드와 미디어의 연결, 실제 발표 환경의 재생이다. 앞의 두 검사는 코드로 자동화할 수 있지만 마지막 검사는 파일 구조만으로 대체할 수 없다.

포스터, 링크, 내장은 서로 다른 결과물이다

포스터는 화면에 보여 줄 이미지다. 클릭하면 웹페이지를 여는 하이퍼링크도 영상의 바이너리를 PPTX에 넣는 작업은 아니다.

파일 내장은 미디어 복사본을 프레젠테이션 패키지 안에 저장하는 방식이다. PPTX 용량은 커지지만, 원본 경로가 바뀌어 링크가 끊기는 문제를 줄일 수 있다. 반대로 연결 방식은 원본 파일이나 서비스에 접근할 수 있어야 한다. Microsoft도 내장과 파일 연결을 구분하고, 연결된 파일은 프레젠테이션과 같은 폴더에 보관하도록 안내한다. Microsoft의 영상 삽입 안내

자동 생성 파이프라인에서는 “영상 추가 완료” 대신 결과를 구체적으로 기록해야 한다. “포스터와 웹 링크 추가”, “영상 파일 내장 확인”, “발표 모드 재생 확인”은 서로 바꾸어 쓸 수 없는 상태다.

PPTX에서는 관계 파일도 확인해야 한다

Open XML 문서는 ZIP 패키지 구조로 살펴볼 수 있다. 미디어 파일이 들어 있는지만 검사하면 부족하다. 파일이 남아 있어도 어느 슬라이드에서도 사용하지 않는 고아 파일일 수 있기 때문이다. Open XML SDK 개요

슬라이드의 관계 파일은 보통 ppt/slides/_rels/slide1.xml.rels 같은 위치에 있다. 관계에는 식별자, 종류, 대상과 외부 여부가 기록된다.

Microsoft의 Media Part 명세는 미디어가 슬라이드·레이아웃·마스터의 명시적 관계 대상이어야 하며, 패키지 내부 또는 외부에 놓일 수 있다고 설명한다. 따라서 media 관계가 있다는 사실만으로 내장이라고 판단하지 말고 TargetMode와 대상 파일을 함께 보아야 한다. Media Part 명세

영상 객체의 r:link라는 속성 이름만 보고 외부 URL이라고 단정하는 것도 잘못이다. 이것은 관계 ID 참조이며, 실제 대상은 관계 파일에서 해석해야 한다. 재생 동작에는 타이밍 요소도 관여한다. 슬라이드에 영상을 추가하는 Open XML 예제

Python으로 내부·외부·누락을 구분하기

다음 코드는 표준 라이브러리만 사용한다. 슬라이드 관계의 audio·video·media 항목을 찾아 외부 연결인지, 내부 대상이 존재하는지 출력한다. URL이나 로컬 원본 경로를 로그에 그대로 남기지 않도록 대상 문자열은 출력하지 않는다.

check_media.py로 저장하고 실행한다.

이 예제는 정상적인 제작 산출물에 대한 최소 점검기다. 신뢰할 수 없는 파일을 대량 검사하는 서비스라면 ZIP 크기·압축 해제량·XML 처리량 제한을 별도로 두어야 한다. 코드는 미디어를 디스크에 추출하거나 외부 URL을 요청하지 않는다.

실제로 확인한 범위

위 코드를 내부 대상이 있는 관계, 외부 관계, 내부 대상이 빠진 관계를 담은 합성 ZIP에 실행했다. 출력은 다음과 같았다.

중요한 점은 합성 ZIP의 내부 파일이 실제 영상이 아니라 자리표시자 바이트였다는 것이다. 이 테스트는 관계 분기와 파일 존재 검사만 검증한다. 유효한 PPTX나 영상 디코딩, PowerPoint 재생을 검증한 결과가 아니다.

INTERNAL_OK라는 이름을 “재생 성공”으로 해석하면 안 된다. 이를 배포 완료 조건으로 쓰려면 다음 검사를 추가해야 한다.

  • 슬라이드 XML에서 관계 ID가 실제 미디어 객체에 연결되는지 검사한다.
  • 콘텐츠 타입과 재생·타이밍 설정을 확인한다.
  • 추출한 파일을 미디어 도구로 열어 실제 스트림·길이·코덱을 검사한다.
  • 최종 발표 앱에서 발표 모드로 실행한다.

레이아웃이나 마스터의 미디어, 웹 비디오 확장 형식, 중복 관계는 이 짧은 예제의 검사 범위 밖이다. 관계 수와 영상 수가 같다고 가정해서도 안 된다.

파일 내장 이후에도 남는 호환성 검사

확장자가 MP4라는 이유만으로 모든 환경에서 재생된다고 볼 수 없다. 컨테이너 안의 영상·오디오 코덱도 확인해야 한다. Microsoft는 PowerPoint용 영상에 H.264와 AAC를 담은 MP4를 권장한다. 지원되는 영상·오디오 형식

프레젠테이션을 다시 저장하거나 다른 도구로 변환한 뒤에는 패키지 검사를 반복한다. 이미지로 렌더링된 슬라이드가 정상이어도 미디어가 보존됐다는 증거는 아니다. 원본과 최종본의 미디어 해시를 비교하면 바이트 보존 여부를 확인할 수 있지만, 그것도 재생 검증을 대신하지는 않는다.

실제 발표 장비에서는 파일을 다시 열고 발표 모드에서 시작·정지·끝까지 재생을 확인한다. 음량, 출력 장치, 첫 프레임, 자막, 다음 슬라이드 전환도 확인한다. 로컬 내장을 의도했다면 네트워크가 없어도 재생되는지 점검한다. 온라인 영상은 연결과 서비스 접근 조건을 따로 기록한다.

완료 기준을 세 줄로 남기기

자동화 결과 보고서는 다음처럼 짧게 나누면 된다.

  • 패키지: 내부 파일과 관계 대상 존재 확인.
  • 미디어: 디코딩·길이 확인 여부 기록.
  • 발표 환경: 앱·버전과 실제 재생 확인 여부 기록.

확인하지 못한 단계는 미확인으로 남긴다. 이것은 품질을 낮추는 표현이 아니라, 다음 사람이 어느 단계부터 점검해야 하는지 알려 주는 정보다. PPTX 자동화의 완료 조건은 재생 버튼을 그리는 것이 아니라, 의도한 환경에서 콘텐츠를 전달하는 것이다.

추천 글