在個視頻檔案的元數據缺失的情況下,獲得視頻的寬高尺寸


發現:

在之前研究Portfolio Multi Media Tab Gallery的源碼的時候,見到在視頻播放功能的模塊里,有如下結構的代碼:


準備工作:

_netConn = new NetConnection();
_netConn.connect(null);

_metadata = new Object();
_metadata.onMetaData = metaDatadHandler;

_netStrm = new NetStream(_netConn);
_netStrm.client = _metadata;
_netStrm.addEventListener(NetStatusEvent.NET_STATUS, netStrm_netStatusHandler, false, 0, true);

_sizeLsnTimer = new Timer(33, 1);
_sizeLsnTimer.addEventListener(TimerEvent.TIMER, lsnSizeTimerHandler, false, 0, true);

_video = new Video();
_video.attachNetStream(_netStrm);
addChild(_video);

listenForVideoSize方法:

private function listenForVideoSize():void
{
	if( _video.videoWidth > 0 && _video.videoHeight )
	{
		_ognlVidWidth = _video.videoWidth;
		_ognlVidHeight = _video.videoHeight;
	}
	else
	{
		_sizeLsnTimer.reset();
		_sizeLsnTimer.start();
	}
}

偵聽視頻元數據的處理方法:

private function metaDatadHandler($info:Object):void
{
	if($info.width && $info.height)
	{
		_ognlVidWidth = Number($info.width);
		_ognlVidHeight = Number($info.height);
	}
	else
	{
		listenForVideoSize();
	}
}


定時器處理方法:


private function lsnSizeTimerHandler($e:TimerEvent):void
{
	listenForVideoSize();
}


思路:

首先嘗試利用client對象偵聽到視頻的元數據來獲得視頻的寬與高的信息;如果不成功,那就呼叫listenForVideoSize方法,這個方法會每隔33毫秒運行一次,它嘗試通過video.videoWidthvideo.videoHeight來得到寬高信息,直到成功為止。


注意:

這個做法有兩個前提,第一個就是假設metaDataHandler一定會被執行,因為那裡是觸動計時器偵聽的地方;第二個就是假設video.videoWidth和video.videoHeight能提供正確的信息。



實際情況:

把我上次遇見的有問題的flv檔案拿來測試,metaDataHandler方法從未被執行過,所以我將觸動listenForVideoSize的代碼放在NetStatusEvent的處理函數里:

private function netStrm_netStatusHandler($e:NetStatusEvent):void
{
	switch ($e.info.code)
	{
		case "NetStream.Play.Start" :
				listenForVideoSize();
				break;
	}
}

於是我得到一組數據:

meta width: 550
meta height: 402

然後將播放視頻的畫面截圖,放在Photoshop里測量視頻範圍的寬和高,我得到的大小是320×240。所以我不再使用videoWidth和videoHeight,而是直接獲取video自己的寬和高video.width和video.height,得到的結果是320×240。


下載源文件


新發現:


但是,其實上面的結論也是錯誤的,之所以會得出320×240這個數據,是因為Video的構造函數的參數默認值:


video-contsructor



所以,即是說,video.width和video.height所提供的信息應該是正確的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值