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

Why is NetStream metadata reading wrong video duration?

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

我试图追踪时间并减去 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 个视频都有同样的问题?我的视频来源来自我的 phone,来自 youtube,来自专业的网上商店。所有文件都是 mp4!

(1)

"...If I use slider to seek video near the end, I get an error saying that time is wrong."

确保 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)

"Why is NetStream metadata reading wrong video duration?

ns.seek(item.duration);

It fails as Error #2044: Unhandled NetStatusEvent:. level=error, code=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.");
    
}