В AS3 при использовании NetStream для воспроизведения видео как искать при использовании appendBytes - PullRequest
2 голосов
/ 29 сентября 2010

Я пытаюсь использовать NetStream для воспроизведения с помощью byteArray.Пожалуйста, посмотрите это , о чем я говорю.

Я могу получить это для воспроизведения видео.Однако теперь мне нужно иметь возможность видеть с точностью до секунды.Я не могу этого сделать.Если я пройду через байтовый массив, я знаю, что могу получить метаданные и ключевые кадры по мере необходимости и смещение (в байтах) относительно того, где находится каждый ключевой кадр.Однако нет способа искать конкретное смещение.Он поддерживает поиск только в считанные секунды, и это не похоже на работу с byteArray.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 28 августа 2012

Я получил, я работал:

// 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;
    }
}​
2 голосов
/ 13 апреля 2011

Каждый тег 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);
    }
}
0 голосов
/ 19 ноября 2015

Попробуйте мой код, размещенный здесь , для примера того, как поиск выполняется без необходимости наличия "ключевых кадров" в метаданных FLV и т. Д. Существует также рабочая демонстрация доступна для тестирования (используйте FLV с H264 и аудио AAC / MP3).

Этот код был частично к , ответьте на этот вопрос (если вам нужна дополнительная информация / контекст)

...