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

Actionscript 3 为什么NetStream元数据读取错误的视频持续时间?,actionscript-3,video,mp4,duration,netstream,Actionscript 3,Video,Mp4,Duration,Netstream,我正在尝试播放和控制一个视频,我需要控制它的关键因素之一是它的持续时间。我写了一个函数,可以播放、暂停、恢复和停止视频,但是,如果我在接近尾声时使用slider搜索视频,我会得到一个错误,说时间不对 我试着追踪时间并减去0.5和1秒。在这种情况下,视频比预期长2-5秒?!维尔德 myVideoData = new Video(); nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc); ns.client = {};

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

我试着追踪时间并减去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\u 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:.level=Error,code=
NetStream.Seek.InvalidTime

这是因为
.duration
是一个数字数据类型,但
.seek
实际上需要一个int

区别在于<代码>编号=16.005vs
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.");
    
}

int(item.duration)执行此任务。不完美,但也不显示错误。我在某个地方读到,问题是当我搜索时,它会搜索到最接近视频关键帧的位置。这不是FLV,这是mp4视频,所以可能是视频中的关键帧排列错误?!要查找任何帧,必须使用
附加字节
模式,然后为其提供视频帧(H.264编解码器)或音频帧(MP3或AAC编解码器)的正确字节。这有点复杂,因为必须将a/v数据包装在(动态创建的)FLV标记中。基本上,它是一个字节数组,大约有11个字节表示“我是FLV容器”,后面是从MP4容器复制的a/v帧数据。如果我完成了我的旧AS3代码(目前只处理无声MP4,因为我也厌倦了处理音频),我会通知你。