有没有机会从ip cam播放h264流?

时间:2012-07-13 06:23:12

标签: actionscript-3 flex h.264 flex4.5

我正在开发一款h264 flash播放器。我从原始h264通过http连接获得字节流(来自ip cam),我必须播放它。 据我所知,flash不能直接播放任何流,我必须将其包装在flv容器中。所以,我要做的是获取一个bytearray,搜索00 00 00 01(NAL开始前缀代码)并将FLV标签添加到此帧,然后使用NetStream.appendBytes()将此最终添加到舞台。 问题是 - 这是正确的方法吗?我的意思是,如果我只是将FLV标签添加到那些帧中,我可以将原始h264转换为flv流吗?可能有更简单的方法从ip cam播放原始h264?

1 个答案:

答案 0 :(得分:1)

你好......我真的希望这会有所帮助......我曾为各种实体使用各种形式的在线视频;从那时我就知道Adobe在播放PlayBack方面已经有12年了......所以如果你被困在使用它--- YouTube仍然使用它......?

我整理了一个AS3示例,它检索objectEncoding属性的值以及框架内容的标题[订单文件] - 为了使用Binary生成所需内容,您将使用appendBytes中的调用( ) - 这会将字节添加到FIFO中,直到FLV标记完成...一旦FLV标记完成,它将使用A调用appendBytes()移动到缓冲区[Thread:playout]:此缓冲区将通知您何时使用FLV标签。不构成完整FLV标记的剩余字节进入FIFO中的FIFO字节(移动@播放缓冲区)。

这是选项2:NetStream对象有两个缓冲区:从appendBytes()到NetStream()对象的FIFO和[playout]缓冲区。 FIFO是重组的部分FLV标签;它包含不超过一个不完整的FLV标记: 调用NetStream .seek。冲洗||缓冲区。寻求本机访问:
appendBytesAction - > readObject - >对象...这里您的数据是序列化的AMF 来自ByteArray并存储它。

以下示例从(文件的||位置)读取订单文件到ByteArray(以字节为单位),解压缩它,并调用readObject()将其存储在each()循环结构中以添加每个节点到显示器:

package 
{
import flash.display.*; 
import flash.events.*; 
import flash.net.*; 
import flash.filesystem.*; 
import flash.utils.ByteArray;
import flash.utils.*;

function wBytes(file:String, data:ByteArray):void{  
     var oFile:File = File.desktopDirectory;
     oFile = oFile.resolvePath(file);
     var oStream:FileStream = new FileStream();
     oStream.open(oFile, FileMode.WRITE);
     oStream.writeBytes(data, 0, data.length); 
     oStream.close(); 
     var iFile = iFile.resolvePath(file);
     var iStream:FileStream = new FileStream();
     iStream.open(iFile, FileMode.READ);
     iStream.readBytes(data);
     iStream.close();
 }
 function readBinBytes():void {
     var iBytes:ByteArray = new ByteArray();
     readFileIntoByteArray("order", iBytes);
     iBytes.position = 0; 
     iBytes.uncompress(CompressionAlgorithm.DEFLATE);
     iBytes.position = 0
     var uVariables:UVariablesiables = new UVariablesiables( "one=1&two=2" )
     uVariables.decode("amp=" + encodeURIComponent( "&" ) );
     uVariables.tree = 3; 
     uVariables.amp2 = "&&";
     var urlRequest:URLRequest = new URLRequest()
     urlRequest.data = uVariables;

     readFileIntoByteArray("order", iBytes);
     iBytes.position = 0;
     iBytes.uncompress(CompressionAlgorithm.DEFLATE); 
     iBytes.position = 0;    
}
function readFileIntoByteArray(Name:String, data:ByteArray):void{
     var fIN:File = File.desktopDirectory
     fIN = fIN.resolvePath(Name)
     var FS:FileStream = new FileStream();
     FS.open(fIN, FileMode.READ);
     FS.readBytes(data);
     FS.close()
     var rq:URLRequest = new URLRequest(FS)
     var variables:URLLoader = new URLLoader();
     variables.dataFormat = URLLoaderDataFormat.VARIABLE
     variables.addEventListener(Event.COMPLETE, function push(event:Event) 
                                               { variables = URLLoader(event.target) }
     try{variables.load(rq} 
         catch(error:*){} 
}

}

这三种方法应该为使用RAW H.26 +的大多数PlayBack环境提供速度和逻辑:没有指定帧速率 - 听起来很简单〜这是大多数公司付出的另一层工作......希望它有所帮助。这不是一个解决方案,但你正在做一些可能需要数周的事情。祝你好运。