CODEONWORT

배포에 관하여 : SWF 안으로 들어간 SWF 본문

Season 1/플래시

배포에 관하여 : SWF 안으로 들어간 SWF

codeonwort 2011.04.15 01:03
이것은 내가 포트폴리오 00003호 - Blackout을 게시하고, 푸붉님이 '사용자가 노래를 선택할 수 있게 만들면 어떠냐?'는 의견을 제안하고 나서 고안한 배포 방법이다.

내가 저 글에 올린 swf는 Embed 태그를 사용해서 mp3 파일을 내장한 것이다. 그래서 용량이 크고 이 노래만을 재생할 수 있다.
* HTML의 <embed> 태그가 아니라 플렉스 SDK의 Embed 메타데이터 태그를 지칭한다

노래 선택 버전을 어떻게 만들까? 단순히 저 플래시에다 노래 선택 기능을 추가할까? 사용자가 이 플래시를 다운로드하고 싶어하면 어떻게 할까? 노래를 이미 하나 끼워놓았기 때문에 쓸데없이 용량이 크다.

노래 선택 버전 swf를 따로 만들어야겠다는 결론에 도달한다. 그럼 이렇게 만든 선택 버전은 어떻게 배포할까? 노래 내장 버전 밑에 이것도 올리고 "이걸 다운로드해서 실행하면 시각화에 쓸 노래를 직접 선택할 수 있어요" 라고 설명을 붙이면 만사 해결...이면 얼마나 좋겠냐만은 이넘의 티스토리가 swf 파일을 글에 첨부하면 <embed> 태그로 넣은 것처럼 재생된다! 가로 세로 크기 조절도 안 된다. (맨날 HTML 편집 모드 열고<embed src=http://codeonwort.tistory.com/attachment/파일주소.swf width=400 height=400> 같은 걸 입력하는 이유다)

결국 선택 버전을 배포할 다른 방법이 필요한데.. 내장 버전에다 버튼을 만들어서, 이 버튼을 누르면 선택 버전을 다운로드하는 것은 어떨까? 그러려면 내장 버전에다 mp3 파일만 끼워넣는 게 아니고 선택 버전 swf도 끼워넣어야 한다. Embed 메타데이터 태그는 이미지나 사운드 파일 끼워넣는 데만 써봤는데 SWF도 잘 될까?


연구 환경

도구 : 플래시 CS5 프로페셔널
파일 (둘 다 같은 폴더에)
    embedded.swf                 노래 선택 버전 플래시
    download_test.fla / .swf    embedded.swf를 내장해서 다운로드 방식으로 배포하는 데 쓸 플래시


download_test.fla를 열고 프레임에 이렇게 입력했다.


플래시 프로페셔널 켜서 플렉스 SDK 처음 쓰고 컴파일하면 항상 보는 그게 뜨니 Update library path를 누르고 다시 실행 -.-


다시 실행하면 딱히 오류가 뜨지 않는 걸로 보아 제대로 끼워넣은 듯하다. 하지만 그건 모르는 일이고..


인스턴스 생성도 되니 제대로 끼워넣은 게 맞는가보다. FileReference 클래스를 써서 저장을 시도했다.


저장된 visualizer.swf를 실행하면 빈 화면이 나를 반기고 -_-..
 


뭐가 문제일까? 레퍼런스로 가서 FileReference#save() 메서드를 보면

public function save(data:*, defaultFileName:String = null):void

data:* — 저장할 데이터입니다. 데이터는 다양한 다음 형식 중 하나일 수 있으며 그에 따라 적절히 처리됩니다.
- 값이 null인 경우 응용 프로그램에서 ArgumentError 예외가 발생합니다.
- 값이 String인 경우 UTF-8 텍스트 파일로 저장됩니다.
- 값이 XML인 경우 텍스트 파일에 XML 형식으로 기록되며 모든 형식을 유지합니다.
- 값이 ByteArray 객체인 경우 데이터 파일에 그대로 기록됩니다.
- 그 외의 값이면 save() 메서드가 객체의 toString() 메서드를 호출하여 데이터를 문자열로 변환한 다음 텍스트 파일로 저장합니다. 이 작업이 실패하면 응용 프로그램에서 ArgumentError 예외가 발생합니다.


swf 인스턴스를 고대로 넣으면 안 된다는 말이다. 그렇다고 다음 코드가 제대로 작동하는 것도 아니다.


텅 빈 스테이지 또다시 나를 반길지니.. -.- ByteArray를 쓰되, swf 인스턴스의 바이너리 데이터를 얻어와서 기록해야 한다. swf의 바이너리 데이터를 어떻게 얻을까? loaderInfo.bytes 속성을 써볼까? 그럴 수 없다. trace(downloadable.loaderInfo) 를 실행하니 null이 찍혔다.

어디서 바이너리 데이터를 얻을 수 있을까? 혹시 MP3SWF에 관련 속성이 있을까 싶어 describeType()으로 클래스 구조를 살펴봤다.


이건가?


엌ㅋㅋ 나이스욬ㅋㅋㅋ 마침 타입도 ByteArray니까 bytearray 변수도 필요 없이 file.save()에 직접 쓰면 된다.


끝. Blackout에 쓸 때는 컨텍스트 메뉴를 이용했다.



* 붙임
var downloadable:MovieClip = new MP3SWF 이 줄을 실행할 때, embedded.swf 인스턴스는 아직 스테이지에 붙지 않은 상태다. 이 인스턴스가 처음부터 stage 속성에 접근하려 하면 돌아오는 것은 null 뿐이다. embedded.swf에는 이런 식으로 코딩해야 한다.



** 붙임
이 글의 덧글을 읽어보자 http://diebuster.com/flash/152

0 Comments
댓글쓰기 폼