【问题标题】:Any chance to play h264 stream from ip cam?有机会从 ip cam 播放 h264 流吗?
【发布时间】:2015-10-08 17:09:48
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

您好...我真的希望这会有所帮助...我为各种实体处理过各种形式的在线视频;我确实知道 Adob​​e 在 PlayBack 方面有大约 12 年的历史……所以,如果你一直在使用它 --- YouTube 仍然在使用它……?

我整理了一个 AS3 示例,该示例检索 objectEncoding 属性的值以及帧内容的标头 [订单文件]--为了使用 Binary 生成您需要的内容,您将在 appendBytes ( )-- 这会将字节添加到 FIFO 中,直到 FLV 标签完成……一旦 FLV 标签完成,它就会使用对 appendBytes() 的调用移动到缓冲区 [线程:播放]:此缓冲区将通知您何时使用FLV 标签。未形成完整 FLV 标签的剩余字节进入 FIFO 中的 FIFO Bytes(移动@播放缓冲区)。

这里是选项 2:NetStream 对象有两个缓冲区:从 appendBytes() 到 NetStream() 对象的 FIFO,以及 [playout] 缓冲区。 FIFO 是重新组装的部分 FLV 标签;它包含不超过一个不完整的 FLV 标签: 调用 NetStream .seek。冲洗 ||缓冲区。 Seek 提供对以下内容的本机访问权限:
appendBytesAction -> readObject -> object... 你的数据在序列化的 AMF 中 从 ByteArray 中提取并存储它。

下面的例子将订单文件从(filename || location for Data)读入一个ByteArray(以Bytes为单位),解压,调用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+ 的播放环境提供速度和逻辑:没有指定帧速率 - 听起来很简单 ~ 这是大多数公司支付的另一层工作......希望它有所帮助。这不是万能的,但您正在做的事情可能需要数周时间。祝你好运。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 2012-07-03
    相关资源
    最近更新 更多