アクションスクリプト3.0を使用してYouTubeビデオを再生する





それでも、顧客は予測可能な人ではありません!



あなたはプロジェクトに取り組み、あなたは働き、すべてがうまくいくようで、プロジェクトが完了する1週間前に彼(顧客)はこう言います。 はい、簡単ではありませんが、YouTubeからです。」 まあ、あなたは何ができますか...何も。



明確にするために、このサイトはAction Script 3.0を使用してFlash CS4で作成されていると言います。



しかし、判明したタスクは簡単ではありませんでした。 そしていつものように外に出なければなりませんでした。







カルマをありがとう! 記事をAdobe Flexブログに移動しました。





開始場所:





関心のあるトピックに関する記事を検索しますか? そして、何が彼らを喜ばせますか、しかし、著者が書いているように、この方法はもはや機能せず、約束された記事の更新はまだ存在しません。 挑戦...



もちろん、プレーヤー全体をダウンロードできますが、Action Script 2で記述されているため、再生の管理を忘れることがあります。 また、ビデオのスケーリングなどの単純なアクションでさえ、耐え難いほど困難なタスクになります。 そして、この方法も消えます。



どうする? 働き、働き、また働きます「そして、あなたはあなたの労苦に報われますように」。 そして、私はステップでソリューションをペイントします:



最初のステップ。 YouTubeプレーヤーをブラウザーキャッシュから取得します(私の場合、FireFoxブラウザーにはabout:キャッシュ機能があります)。



2番目のステップ。 特別なプログラムを使用してプレーヤーのコードを調べます(多くのプログラムがあります。私はSothink SWF Decompilerを使用します)。



第三のステップ。 多数のクラスで必要な情報、つまり、ビデオへの直接リンクを取得する場所と方法を探しています。 この記事から、ビデオへの直接リンクを取得するには、ビデオ識別番号(video_id)と何らかのビデオ識別マーク(パラメーターt)の2つのことを知る必要があることがわかります。 video_idを使用すると、すべてが簡単になります。これは、ビデオのリクエスト行http://www.youtube.com/watch?v=lIZVEnyHoGUにあり、「v」と呼ばれます。 そして、ここに「t」を取得する場所があります。ここで、私たちが分解したプレーヤーが私たちを助けてくれます。そこから、ビデオIDを持つサーバーへの特定のリクエストがあることがわかります。 リクエストは次のとおりですhttp://youtube.com/get_video_info.php?video_id=lIZVEnyHoGU 。 このリンクをブラウザの行に貼り付けると、「get_video_info.php」というファイルをダウンロードするよう求められます。 ファイルの内容をダウンロードして監視します。 ファイルには、「status = ok&vq = None&author = guylevy ...など」という形式の変数を含む行が含まれています。 したがって、私たちが必要とするさまざまな変数のうち、「トークン」と呼ばれるものです。実際、このネットワークは私たちが探していたまさに「t」です。



ステップ4 目的を達成しました-ビデオへの直接リンクを取得し、一緒になったものすべてを追加するとhttp://www.youtube.com/get_video.php?video_id=lIZVEnyHoGU&t= vjVQa1PpcFNnve5gW7h8B51Da_gr8T6BHzSFMbwf6Ww3d%w 「video.flv」という名前のflv-video。これは、プレーヤーでダウンロードまたは再生できます。



したがって、3番目のステップを完了するには、「get_video_info.php」をテキストファイルとしてダウンロードし、そこから必要な情報を取得する必要があります。 フォーラムの1つで見つけた「URL.as」クラスはこれを助けてくれました。URLからほぼすべての情報を取得するのに役立ちます。また、改良後、エンコードされたドット、ダッシュ、プラスなどでURLをエンコードおよびデコードします。 d。

直接リンクを取得するプロセス全体を、クラス「YouTubeVideoPlayer.as」に実装しました



また、クラス「YouTubeVideoPlayer.as」 でYouTubeを操作するための10のトリックに関する記事を使用すると、受信したビデオの品質を設定できます(ある場合)。



実際、「世界を救う」これらの2つのクラス:)



(上記のコードはFlexで使用するために記述されています)



package com

{

import flash.events.Event;

import flash.net.URLLoader;

import flash.net.URLRequest;



import mx.controls.VideoDisplay;

import mx.events.VideoEvent;



import com.URL;



/**

* YouTubeVideoPlayer.

* @author Aslanyan Tsolak Rubikovich

* @version 1.0

*/



public class YouTubeVideoPlayer extends VideoDisplay

{

private static var GET_VIDEO :String = "http://www.youtube.com/get_video.php";

private static var GET_VIDEO_INFO :String = "http://youtube.com/get_video_info.php";

private static var URL_PREFIX :String = "http://youtube.com?";

private static var QUALITY0 :String = "";

private static var QUALITY1 :String = "&fmt=18";

private static var QUALITY2 :String = "&fmt=22";

private static var QUALITY3 :String = "&ap=%2526fmt%3D18";

private static var QUALITY4 :String = "&ap=%2526fmt%3D22";



private var videoID :String;

private var videoToken :String;

private var videoQuality :String;

private var InfoLoader :URLLoader;



/**

* .

* @params source: www.youtube.com/watch?v=lIZVEnyHoGU

* @params quality: [0,1,2,3,4]

* @return void

*/



public function YouTubeVideoPlayer(source:String, quality:Number):void

{

super();



videoQuality = DefineQuality(quality);



LoadVideoInfo(source);

}



/**

* .

* @params quality: [0,1,2,3,4]

* @return

*/



private function DefineQuality(quality:Number):String

{

switch(quality)

{

case 0: return QUALITY0; break;

case 1: return QUALITY1; break;

case 2: return QUALITY2; break;

case 3: return QUALITY3; break;

case 4: return QUALITY4; break;

}



return QUALITY0;

}



/**

* .

* @params source: www.youtube.com/watch?v=lIZVEnyHoGU

* @return void

*/



private function LoadVideoInfo(source:String):void

{

videoID = GetVideoID(source);



var urlRequest :URLRequest = new URLRequest(GET_VIDEO_INFO + "?video_id=" + videoID);



InfoLoader = new URLLoader();

InfoLoader.addEventListener(Event.COMPLETE, OnInfoLoaderComplete);

InfoLoader.load(urlRequest);

}



/**

* source VideoID.

* @params source: www.youtube.com/watch?v=lIZVEnyHoGU

* @return VideoID

*/



private function GetVideoID(source:String):String

{

var _url:URL = new URL(source);



return _url.query.parsed.v;

}



/**

* get_video_info.php.

* @return void

*/



private function OnInfoLoaderComplete(e:Event):void

{

InfoLoader.removeEventListener(Event.COMPLETE, OnInfoLoaderComplete);



var str:String = URL_PREFIX + "?" + e.target.data.toString();



videoToken = GetVideoToken(str);



var fullVideoUrl:String = FlvUrlConstruct(videoID, videoToken);



InitVideoDisplay(fullVideoUrl);

}



/**

* source videoToken.

* @params source: get_video_info.php.

* @return videoToken

*/



private function GetVideoToken(source:String):String

{

var _url:URL = new URL(source);



return _url.query.parsed.token;

}



/**

* URL .

* @params video_id: id .

* @params token: id .

* @return videoToken

*/



private function FlvUrlConstruct(video_id:String, token:String):String

{

var fullUrl:String = GET_VIDEO + "?video_id=" + video_id + "&t=" + token + videoQuality;



return fullUrl;

}



/**

* VideoDisplay.

* @params source: .

* @return void

*/



private function InitVideoDisplay(source:String):void

{

this.autoPlay = true; //

this.source = source; //

this.width = 500; //

this.height = 281.25; //

this.autoRewind = true; //

this.maintainAspectRatio = true; //

this.playheadUpdateInterval = 100; // VideoEvent.PLAYHEAD_UPDATE

this.bufferTime = 5; //



this.addEventListener(VideoEvent.STATE_CHANGE, StateChange);

}



private function StateChange(e:VideoEvent):void

{

trace(e.state)

}

}

}








そして別のクラス



package com

{

/**

* Dschini.org - Manfred Weber

* manfred.dschini.org

* manfred.weber (at) gmail dot com

* Updated Tsolak Aslanyan

* version 1.1

*/



public class URL

{

private static const PATTERN:RegExp = /^([A-Za-z0-9_+.]{1,8}:\/\/)?([!-~]+@)?([^\/?#:]*)(:[0-9]*)?(\/[^?#]*)?(\?[^#]*)?(\#.*)?/i;



private var _url :String;

private var _scheme :String;

private var _userinfo :String;

private var _host :String;

private var _port :String;

private var _path :String;

private var _query :String;

private var _fragment :String;



/**

* Create new URL Object

* @params The url

*/



function URL(url:String):void

{

var result:Array = url.match(URL.PATTERN);



_url = result[0]; // user:pass@example.com:80/foo/bar.php?var1=foo&var2=bar#abc

_scheme = result[1]; // http://

_userinfo = result[2]; // user:pass@

_host = result[3]; // example.com

_port = result[4]; // :80

_path = result[5]; // /foo/bar.php

_query = result[6]; // ?var1=foo&var2=bar

_fragment = result[7]; // #abc

}



/**

* Get the url

*/



public function get url():String

{

return _url.length <= 0 ? undefined : _url;

}



/**

* Get the scheme

*/



public function get scheme():String

{

return _scheme.length <= 0 ? undefined : _scheme.substring(0 , _scheme.length - 3);

}



/**

* Get the userinfo

* Returns an object containing the user and/or password

*/



public function get userinfo():Object

{

var ret:Object = {user:undefined, pass:undefined};



if(_userinfo)

{

var arr:Array = _userinfo.substring(0, _userinfo.length - 1).split(':');



ret.user = arr[0] ? arr[0] : ret.user;

ret.pass = arr[1] ? arr[1] : ret.pas;

}



return ret;

}



/**

* Get the host

*/



public function get host():String

{

return _host.length <= 0 ? undefined : _host;

}



/**

* Get the port

*/



public function get port():int

{

return _port.length <= 0 ? undefined : int(_port.substring(1, _port.length));

}



/**

* Get the path

*/



public function get path():String

{

return _path.length <= 0 ? undefined : _path;

}



/**

* Get the query

* Returns an object containing the raw and parsed query string

*/



public function get query():Object

{

var ret:Object = {raw:undefined, parsed:undefined};



if(_query && _query.length > 0)

{

ret.raw = _query;



var _parse :String = _query.substring(1, _query.length);

var _intovars :Array = _parse.split("&");



ret.parsed = _intovars.length > 0 ? {} : undefined;



for(var i:int = 0; i < _intovars.length; i++)

{

var _kv:Array = _intovars[i].split("=");



ret.parsed[_kv[0]] = _kv[1];

}

}

return ret;

}



/**

* Get the fragment

*/



public function get fragment():String

{

return _fragment.length <= 0 ? undefined : _fragment;

}



/**

* Accepts an encoded string.

* Returns the decoded string.

*/



public function Unescape(value:String):String

{

return unescape(value);

}



/**

* Accepts an decoded string.

* Returns the encoded string.

*/



public function Escape(value:String):String

{

return escape(value);

}

}

}









Flex Builderでクラスを使用する例を次に示します。





<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">



<mx:Script><![CDATA[



import com.YouTubeVideoPlayer;



private var vp:YouTubeVideoPlayer;



private function GetVideo():void

{

if(vp != null)

{

vp.stop();

vp.close();

removeChild(vp);

}



var vp:YouTubeVideoPlayer = new YouTubeVideoPlayer(utUrl.text, 1);

vp.x = 119;

vp.y = 38;

addChild(vp);

}

]]></mx:Script>



<mx:Label x="10" y="12" text=" "/>

<mx:TextInput id="utUrl" x="119" y="10" width="600" text="http://www.youtube.com/watch?v=lIZVEnyHoGU"/>

<mx:Button x="727" y="10" label="" click="GetVideo()"/>



</mx:Application>









この記事が誰かを助けるか、少なくとも面白いと思うことを願っています。



PS

アユルガノフ 、招待ありがとう!



PPS

トピックを転送するカルマはありません:(






All Articles