我正在开发 h264 flash 播放器。我通过 http 连接获得原始 h264 的字节流(来自 ip cam),我必须播放它。据我所知,flash 不能直接播放任何流,我必须将它包装在 flv 容器中。所以,我要做的是获取一个字节数组,搜索 00 00 00 01(NAL 起始前缀代码)并将 FLV 标记添加到此帧,然后使用 NetStream.appendBytes() 将其最终添加到舞台。问题是——这是正确的方法吗?我的意思是,如果我只是将 FLV 标签添加到这些帧,我可以将原始 h264 转换为 flv 流吗?可能有更简单的方法从 ip cam 播放原始 h264 吗?
1 回答
您好……我真的希望这会有所帮助……我为各种实体处理过各种形式的在线视频;从那我知道 Adobe 在 PlayBack 方面有大约 12 年的时间......所以如果你坚持使用它 --- YouTube 仍然使用它......?
我整理了一个 AS3 示例,该示例检索 objectEncoding 属性的值以及帧内容的标头 [订单文件]--为了使用 Binary 生成所需的内容,您将使用 appendBytes () 处的调用--这会将字节添加到 FIFO 中,直到 FLV 标签完成……一旦 FLV 标签完成,它会使用对 appendBytes() 的调用移动到缓冲区 [线程:播放]:此缓冲区将通知您何时使用 FLV 标签。未形成完整 FLV 标签的剩余字节进入 FIFO 中的 FIFO 字节(移动@播放缓冲区)。
这是选项 2:NetStream 对象有两个缓冲区:从 appendBytes() 到 NetStream() 对象的 FIFO,以及 [playout] 缓冲区。FIFO 是重新组装的部分 FLV 标签;它包含不超过一个不完整的 FLV 标记:调用 NetStream .seek。冲洗 || 缓冲区。Seek 提供对以下内容的本机访问:
appendBytesAction -> readObject -> object... 这里您的数据在 ByteArray 的序列化 AMF 中并存储它。
以下示例将订单文件从 (filename || location for Data) 读取到 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:*){}
}
}
这 3 种方法应该为大多数使用 RAW H.26+ 的播放环境提供速度和逻辑: 没有指定帧速率 - 听起来很简单 - 这是大多数公司支付的另一层工作......希望它有所帮助。这不是万能的,但您正在处理可能需要数周时间的事情。祝你好运。