我正在开发一款h264 flash播放器。我从原始h264通过http连接获得字节流(来自ip cam),我必须播放它。 据我所知,flash不能直接播放任何流,我必须将其包装在flv容器中。所以,我要做的是获取一个bytearray,搜索00 00 00 01(NAL开始前缀代码)并将FLV标签添加到此帧,然后使用NetStream.appendBytes()将此最终添加到舞台。 问题是 - 这是正确的方法吗?我的意思是,如果我只是将FLV标签添加到那些帧中,我可以将原始h264转换为flv流吗?可能有更简单的方法从ip cam播放原始h264?
答案 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环境提供速度和逻辑:没有指定帧速率 - 听起来很简单〜这是大多数公司付出的另一层工作......希望它有所帮助。这不是一个解决方案,但你正在做一些可能需要数周的事情。祝你好运。