我想用NetStream從byteArray播放。請參閱this瞭解我所談論的內容。在使用NetStream進行視頻播放的AS3中我該如何尋找當我使用appendBytes
我能夠得到這個播放視頻。但是現在我需要能夠看到特定的秒鐘。我無法做到這一點。如果我通過bytearray,我知道我可以根據需要獲取元數據和關鍵幀,以及每個關鍵幀所在的偏移量(以字節爲單位)。但是,沒有辦法尋求特定的抵消。它只支持在幾秒鐘內尋找,似乎不能在byteArray上工作。
我該如何解決這個問題?
我想用NetStream從byteArray播放。請參閱this瞭解我所談論的內容。在使用NetStream進行視頻播放的AS3中我該如何尋找當我使用appendBytes
我能夠得到這個播放視頻。但是現在我需要能夠看到特定的秒鐘。我無法做到這一點。如果我通過bytearray,我知道我可以根據需要獲取元數據和關鍵幀,以及每個關鍵幀所在的偏移量(以字節爲單位)。但是,沒有辦法尋求特定的抵消。它只支持在幾秒鐘內尋找,似乎不能在byteArray上工作。
我該如何解決這個問題?
每個flv標籤都有一個時間戳和偏移量。 您可以在這裏找到FLV規範:http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf
您無法在任何位置播放視頻。您必須從標籤的開始處開始,因此您需要找到最接近您要查找的時間的標籤。
你會想要做這樣的事情:
private var tags:Array = [];
private var fileStream:FileStream;
private var netStream:NetStream;
private var seekTime:Number;
public function function readTags(path:String):void
{
//open the fileStream for reading
while(fileStream.bytesAvailable > 0)
{
//sudo code for reading the tags of an FLV
var tagPosition:int = fileStream.position;
var tagSize:int = //Read the tag size;
var timestamp:int = //read the timestamp;
tags.push({timestamp:timestamp, position:tagPosition}];
fileStream.position += tagSize; //goto the next tag
}
}
private function findTagPosition(timeInMilliseconds:int):int
{
//Search the tags array for the tags[a].timestamp that is nearest to timeInMilliseconds
return tags[indexOfTagNearstToTimeInMilliseconds].position;
}
public function seek(time:Number):void
{
seektime = time;
netStream.seak(time);
}
private function onNetStatusEvent(event:NetStatusEvent):void
{
if(event.info.code == NetStreamCodes.NETSTREAM_SEEK_NOTIFY)
{
fileStream.position = findTagPosition(seekTime * 1000);
netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
var bytes:ByteArray = new ByteArray();
fileStream.readBytes(bytes);
netStream.appendBytes(bytes);
}
}
我有我的工作:
// onmetadata function get all timestamp and corresponding fileposition..
function onMetaData(infoObject: Object): void {
for (var propName: String in infoObject) {
if (propName == "keyframes") {
var kfObject: Object = infoObject[propName];
var timeArr: Array = kfObject["times"];
var byteArr: Array = kfObject["filepositions"];
for (var i: int = 0;i < timeArr.length;i++) {
var tagPos: int = byteArr[i]; //Read the tag size;
var timestamp: Number = timeArr[i]; //read the timestamp;
tags.push({
timestamp: timestamp,
tagPos: tagPos
});
}
}
// onseek click get approximate timestamp and its fileposition
protected
function seek_click(seektime: Number): void {
var cTime: Number = 0;
var pTime: Number = 0;
for (var i: int = 1;i < tags.length;i++) {
cTime = tags[i].timestamp;
pTime = tags[i - 1].timestamp;
if (pTime < seektime) {
if (seektime < cTime) {
seekPos = tags[i - 1].tagPos;
stream.seek(pTime);
break;
}
}
}
}
/// append bytes on seekposition
private
function netStatusHandler(event: NetStatusEvent): void {
switch (event.info.code) {
case "NetStream.Seek.Notify":
stream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
totalByteArray.position = seekPos;
var bytes: ByteArray = new ByteArray();
totalByteArray.readBytes(bytes);
stream.appendBytes(bytes);
stream.resume();
break;
}
}
嘗試my code posted here爲追求的是如何操作的實例,而無需「關鍵幀」存在於FLV元數據等中。還有一個可用於測試的FLASH(使用帶有H264和AAC/MP3音頻的FLV)。
該代碼部分是要answer this question(如果需要其他信息/上下文)