为什么NetStream元数据读取错误的视频持续时间



我正在尝试播放和控制视频,我需要控制它的一个关键元素是它的持续时间。我写了一个函数,可以播放、暂停、恢复和停止视频,但是,如果我在接近尾声时使用滑块查找视频,我会收到一个错误,说时间不对。

我试着追踪时间,减去0.5和1秒。在这种情况下,视频比预期的长2-5秒?!维尔德。

myVideoData = new Video();
nc = new NetConnection();
nc.connect(null);
ns = new NetStream(nc);
ns.client = {};
ns.client.onMetaData = ns_onMetaData;
ns.client.onCuePoint = ns_onCuePoint;
myVideoData.attachNetStream(ns);
ns.play(menu.videolist.selectedItem.data); //Video is loading and playing just fine
function ns_onMetaData(item: Object): void {
myVideoDataW = item.width;
myVideoDataH = item.height;
myVideoDuration = item.duration;
//Below this line is added for testing.
ns.seek(item.duration); //It fails as Error #2044: Unhandled NetStatusEvent:. level=error, code=NetStream.Seek.InvalidTime
//Tried to ns.seek(item.duration-1); and it works, except it seeks video not 1, but 2-5 seconds, depending on video length
//I have same issue for every video, and I have tried like... 50-ish...
}

我只想知道是关于代码,关于我。。。?有没有可能我试过的50个视频都有同样的问题?我的视频来源于我的手机、youtube和专业网店。所有文件都是mp4!

(1)

"。。。如果我使用滑块在接近尾声时寻找视频,我会得到一个错误,说时间不对">

确保myVideoDuration已知或设置为= 0;作为起点例如:由于ns_onMetaData功能会更新持续时间,因此您也可以使用:进行搜索

mc_Seekbar.addEventListener(MouseEvent.CLICK, on_click_SeekBar );

然后你可以使用这个逻辑来寻找:

function on_click_SeekBar (evt:Event = null) :void
{
var myTime:int = (myVideoDuration / mc_Seekbar.width ) *  mc_Seekbar.mouseX;
trace(">>> Seeking to : " + myTime + " seconds");
ns.seek( myTime );
}

(2)

"为什么NetStream元数据读取错误的视频持续时间

ns.seek(item.duration);

它失败,原因是错误#2044:未处理的NetStatusEvent:。电平=错误,代码=NetStream.Seek.InvalidTime">

这是因为.durationNumber数据类型,但.seek实际上需要int值。

差异是…Number = 16.005;int = 16;。数字包括一个小数点。NetStream的.seek需要一个没有分数的整数(基本上:只使用整数,没有小数点)。

解决方案
只需将.duration强制转换为int数据类型。

ns.seek( int(item.duration) );

下面是一个基于代码的可测试示例。在编译的同一位置给它一个名为video.mp4的文件。

var myVideoData :Video = new Video();
var nc = new NetConnection(); nc.connect(null);
var ns :NetStream = new NetStream(nc);
ns.client = {};
ns.client.onMetaData = ns_onMetaData;
//ns.client.onCuePoint = ns_onCuePoint;
myVideoData.attachNetStream(ns);
var myVideoDuration:int, myVideoDataW:int, myVideoDataH:int = 0;
addChild(myVideoData);
//ns.play(menu.videolist.selectedItem.data); //Video is loading and playing just fine
ns.play("video.mp4");
function ns_onMetaData(item: Object) :void 
{
myVideoDataW = item.width;
myVideoDataH = item.height;
myVideoDuration = item.duration; //update Int with duration

//# Below this line is added for testing.
ns.seek( int(item.duration) ); //option A: cast the Number to Int
//ns.seek( myVideoDuration ); //option B: use an Int value
trace("duration ( item.duration ) : " + ( item.duration) + " seconds.");
trace("duration (myVideoDuration) : " + ( myVideoDuration) + " seconds.");

}

最新更新