我目前正在开发具有分辨率切换功能的Flash网络播放器.我试图play2()在Actionscript中使用NetStream类的函数.
我遇到的问题是视频不会很快改变.对于那些熟悉这个play2()功能的人,我认为玩家正在表演"standard switch"而不是表演"fast switch."
文档说,当offset参数为-1时,会发生快速切换.实际发生了什么,但是一旦"NetStream.Play.Transition"接收到事件,玩家ns.time + ns.bufferLength在执行切换之前等待直到达到指示的时间.
我认为快速切换清除了缓冲区,但在检查时ns.backbufferlength,我发现所有内容仍然被缓存.它还提到:"当偏移为-1时,切换发生在第一个可用的关键帧之后netstream.time + 3,"这就是我感到困惑的原因.
任何有关此事的帮助/见解将不胜感激.
下面是一段描述正在发生的事情的代码(newStream()当用户点击更改为新的分辨率,youtube样式时调用):
public function newStream(address:String):void
{
var opts:NetStreamPlayOptions = new NetStreamPlayOptions();
opts.streamName = address;
opts.transition = NetStreamPlayTransitions.SWITCH;
opts.offset = -1;
ns.play2(opts);
}
private function nsCallback(event:NetStatusEvent)
{
switch(event.info.code)
{
case "NetStream.Play.Transition":
{
trace("Current time (on Transition): " +
ns.time, "Buffer: " + ns.bufferLength);
var estTime:Number = ns.time + ns.bufferLength;
trace("Estimated Completion Time: " …Run Code Online (Sandbox Code Playgroud) 我必须使用自定义组件替换现有Flex项目中的mx:VideoDisplay组件.
为了实现这一点,我必须符合其当前的接口,因此我的组件以以下形式接收视频URL(通过源参数):
我的新组件基于NetConnection和NetStream.对于上面的任何条目,我必须将输入拆分为两个字符串:一个用于NetConnection.connect(NetConnectionStr)方法,另一个用于NetStream.play(NetStreamStr)方法.例如:
构建这两个字符串对于"本地文件"情况非常明显,但在其他情况下却变得棘手.问题是我没有聪明的方法来猜测输入的哪一部分是服务器URL,哪个部分是流名称+目录结构.
在互联网上发现的一些例子中,人们只是猜测源的最后部分(找到最后一个"/"之后的部分)是NetStream名称.在我的情况下,这并不总是正确的,因为流可能在服务器上的子目录中.更糟糕的是因为服务器名称可能包含"/"字符!
由于NetConnection似乎足够"智能",我的第一次尝试是使用完整的源URL调用connect方法.例如,给定 rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv
NetConnection取得了成功:
然后我希望以某种方式检索服务器的"真实"URL(rtmp://streamcloud.myserver.com/cfx/st),这样我就能猜出流部分(somedirectory/subdirectory/myflvfile).
不幸的是,我发现无法从NetConnection对象中获取真正的服务器地址(connection.uri返回确切的输入).所以这似乎是一个死路一条.
另一种策略可能是连接到服务器,然后迭代地尝试(从最后开始)播放流直到它工作:
鉴于rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv:
借助Flash 10.1+以及在NetStream上使用appendBytes的功能,可以在Flash中使用HTTP流进行视频传输.但似乎交付方法要求将段存储在磁盘上的单个文件中,该文件只能通过FMS或Apache模块分解为离散的段文件.您可以在创建单个段文件后对其进行缓存,但文档表明您仍必须始终使用FMS/Apache模块在第一个实例中生成这些文件.
是否可以在不使用FMS,Wowza产品或Apache的情况下将单个磁盘文件分成多个磁盘段?
这个让我至少走了一个星期.我正在尝试将视频文件录制到AMS.它几乎在所有时间都很好用,除了大约十分之一或十五个录制会话,当我关闭流时,我从未在AMS的网络上收到'NetStream.Unpublish.Success'.当发生这种情况时,我使用rtmpt连接到AMS,它似乎比rtmp工作得更好.此外,似乎这只发生在Mac上的safari中,但由于它如此断断续续,我真的不相信.这是我的基本流程:
// just a way to use promises with netStatusEvents
private function netListener(code:String, netObject:*):Promise {
var deferred:Deferred = new Deferred();
var netStatusHandler:Function = function (event:NetStatusEvent):void {
if (event.info.level == 'error') {
deferred.reject(event);
} else if (event.info.code == code) {
deferred.resolve(netObject);
// we want this to be a one time listener since the connection can swap between record/playback
netObject.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
};
netObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
return deferred.promise;
}
// set up for recording
private function initRecord():void {
Settings.recordFile = Settings.uniquePrefix + (new …Run Code Online (Sandbox Code Playgroud) rtmp flash-media-server actionscript-3 netstream adobe-media-server
我在AS3中遇到NetStream问题.我正在开发的项目允许用户浏览视频(本地)并播放.我遇到的问题是,netStream.seek(0);我可以告诉它没有做任何事情,虽然我进入NetStatusEvent函数并被NetStream.Seek.Notify触发.我正在使用NativeProcess,以下功能使这有任何区别.
public function ProgressEventOutputHandler(e:ProgressEvent):void {
videoByteArray = new ByteArray();
nativeProcess.standardOutput.readBytes(videoByteArray, 0, nativeProcess.standardOutput.bytesAvailable);
netStream.appendBytes(videoByteArray);
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?我在使用前暂停netStream netStream.seek(0);.
编辑:
为了解决这个问题,我按照VC的说明进行操作.我已经完成了以下操作:
移动videoByteArray = new ByteArray();到我的init函数,并tempVideoByteArray = new ByteArray();在此函数中创建.
更新我的ProgressEventOutputHandler函数,使其不再为videoByteArray创建新的ByteArray并更改此行 - nativeProcess.standardOutput.readBytes(videoByteArray, videoByteArray.length, nativeProcess.standardOutput.bytesAvailable);
我没有改变任何其他内容,现在视频无法加载.如果我允许在ProgressEventOutputHandler函数内创建新的ByteArray,则视频会再次加载.
我正在使用NetConnection和NetStream来传输音频.我知道您可以使用Sound对象实时修改示例数据,但是我无法找到用于使用NetStream对象播放音频的SampleDataEvent.有没有办法将音频从NetStream对象传递到Sound对象并修改该对象的声音?
编辑: 我愿意做任何疯狂的黑客攻击,所以任何解决方案都可以!
我读过 Tcp Echo 服务器的示例,但有些事情我不清楚。
TcpClient client = null;
NetworkStream netStream = null;
try {
client = listener.AcceptTcpClient();
netStream = client.GetStream();
int totalBytesEchoed = 0;
while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
netStream.Write(rcvBuffer, 0, bytesRcvd);
totalBytesEchoed += bytesRcvd;
}
netStream.Close();
client.Close();
} catch {
netStream.Close();
}
Run Code Online (Sandbox Code Playgroud)
当服务器收到数据包(while 循环)时,他将数据读入 rcvBuffer 并将其写入流。
让我困惑的是通信中消息的时间顺序。使用 netStream.Write() 写入的数据是立即发送到客户端(甚至可能仍在发送),还是仅在已写入流(由客户端)处理的数据之后发送。
下面的问题甚至可以澄清前面的问题:如果客户端通过写入流来发送一些数据,那么该数据是否会移动到服务器端的消息队列中等待读取,因此流实际上是“空”?这可以解释为什么服务器可以立即写入流 - 因为来自流的数据实际上在其他地方缓冲......?
从Flash 10.1开始,他们添加了通过appendBytes方法将字节添加到NetStream对象的功能(在此处描述http://www.bytearray.org/?p=1689).这一新增的主要原因是Adobe最终支持视频的HTTP流媒体.这很棒,但您似乎需要使用Adobe Media Streaming Server(http://www.adobe.com/products/httpdynamicstreaming/)从现有视频中创建正确的视频块,以实现流畅的流式传输.
我曾经试图在我交换NetStream对象的过程中做一个被黑客攻击的HTTP流媒体版本(类似于http://video.leizhu.com/video.html),但是这些块之间总会暂时停顿一下.使用新的appendBytes,我尝试使用前一个站点的两段视频进行快速模拟,但即便如此,跳过仍然存在.
有没有人知道如何形成两个连续的.FLV文件,以便NetStream对象上的appendBytes方法创建一个漂亮的平滑视频,而段之间没有明显的跳过?
我在数据生成模式下使用NetStream来使用appendBytes播放嵌入式FLV.当流完成播放时,我想循环FLV文件.我不知道如何实现这一目标.这是我到目前为止(这不是一个完整的例子):
public function createBorderAnimation():void
{
// Load the skin image
borderAnimation = Assets.BorderAnimation;
// Convert the animation to a byte array
borderAnimationBytes = new borderAnimation();
// Initialize the net connection
border_nc = new NetConnection();
border_nc.connect( null );
// Initialize the net stream
border_ns = new NetStream( border_nc );
border_ns.client = { onMetaData:function( obj:Object ):void{ trace(obj); } }
border_ns.addEventListener( NetStatusEvent.NET_STATUS, border_netStatusHandler );
border_ns.play( null );
border_ns.appendBytes( borderAnimationBytes );
// Initialize the animation
border_vd = new Video( 1024, 768 );
border_vd.attachNetStream( border_ns …Run Code Online (Sandbox Code Playgroud) 我使用他们的风头服务器可以串流影片创造了一个播放器客户端在过去,没有前一个问题,但是,对于使用不同的风头服务器的新的客户端,视频似乎太早结束3-4秒.
我测试了3个截然不同的视频的痕迹:
metadata duration = 32 // 32 secs long, ends at 27
Stop [27.350 seconds] = 4.65
metadata duration = 17 // 17 secs long, ends at 12
Stop [12.852 seconds] = 4.148
metadata duration = 258 // 258 secs long, ends at 255
Stop [255.861 seconds]
Run Code Online (Sandbox Code Playgroud)
在我检查的视频播放器中,NetStream.Play.Stop然后在那里放置一个'重置'类型的功能.然而,由于这个奇怪的错误,此功能会过早触发.有没有人见过这个?
private function netStatusHandler(event:NetStatusEvent):void
{
trace("connected is: " + nc.connected );
switch (event.info.code)
{
case "NetConnection.Connect.Success":
trace("Connected");
connectStream();
break;
case "NetStream.Play.Start":
trace("********** Start [" + ns.time.toFixed(3) + " seconds]"); …Run Code Online (Sandbox Code Playgroud) 我想从其中一个同伴发布一个mp3文件,并从其他同行播放,与RTMFP聊天应用非常相似.
从我理解到现在:
netstream.publish用于将流发布到RTMFP网络连接以及netstream.play从其他对等方播放流. 如果我上面错了,请纠正我.理想情况下,我想要实现的目标应该很容易实现,但我找不到任何指针.是否可以使用ByteArray.只要适用于RTMFP,任何其他流媒体策略都会受到欢迎.代码示例的链接也很棒.
我正在使用Flash 8(AS2)和Flash Media Server 3制作网络摄像头视频流应用程序.实时流式传输视频非常简单,但我想让发布者能够暂停他们的流,有效地让人们观看快照而不是实时视频.
NetStream有一个pause()方法,但文档说它只适用于订阅者.有没有办法暂停流的发布?
netstream ×12
flash ×9
actionscript ×4
apache-flex ×4
rtmp ×2
air ×1
audio ×1
c# ×1
ffmpeg ×1
packet ×1
rtmfp ×1
streaming ×1
tcplistener ×1