Как получить текущий кадр воспроизводимого видеофайла? - PullRequest
2 голосов
/ 06 декабря 2010

Итак, у нас есть файл flv, мы воспроизводим его, например, с помощью mx: vidodisplay. как узнать, в каком кадре потока мы сейчас находимся?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

вы можете проверить ближайший ключевой кадр к текущему времени в метаданных потока UPD при создании потока вам нужно обработать его вызов onMetaData:

private var metaInfo: Object;
private function initStream():void{
     stream = new NetStream(conn);
     stream.bufferTime = 5;            
     stream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
     stream.client = new Object();
     stream.client.onMetaData = onMetaData;/*this is what you need*/
     video.attachNetStream(stream);
}
private function onMetaData(info:Object):void {
    metaInfo = info;
    var tmpstr:String = '';
    for(var s:String in info){
       var tstr:String = s + ' = ' + info[s] + '\n';
       tmpstr += tstr.indexOf('object') == -1 ? tstr : '';
       for(var a:String in info[s]){
           var ttstr:String = s + ':' + a + ' = ' + info[s][a] + '\n';
           tmpstr += ttstr.indexOf('object') == -1 ? ttstr : '';
            for(var c:String in info[s][a]){
                var tttstr:String = s + ':' + a + ':' + c + ' = ' + info[s][a][c] + '\n';
                tmpstr += tttstr.indexOf('object') == -1 ? tttstr : '';                     
            }
        }
    }
    trace(tmpstr);          
}

. В этой трассировке вы увидите, есть ли у метаданных потоков такие элементы, как:точки поиска: 93: смещение = 10342550точки поиска: 93: время = 165,799или, может быть:ключевые кадры: времена = 0,0.48,0.96,1.44,1.92,2.4,2.88,3.36,3.84,4.32,4.8,5.28,5.76,6.24ключевые кадры: filepositions = 1063,95174,136998,176043,209542,239148,271062,302006,331724,363948,395039,427503,456317,483313это зависит от настроек кодера, если в ваших метаданных есть какой-либо объект такого типа (metadata['keyframes'], metadata['seekpoints'] и т. д.), вы можете сделать следующее:

for (var i:int = 0; i < metaInfo['keyframes']['times'].length; i++) {
    if (stream.time < metaInfo['keyframes']['times'][i]) {
        var keyFrameNum: int = (metaInfo['keyframes']['times'][i] - stream.time < stream.time - metaInfo['keyframes']['times'][i - 1]) ? i : i - 1;
    }
}
0 голосов
/ 01 июля 2014

Я сделал статический класс для разбора объекта метаданных netstream в объект as3. Вы можете использовать JSON.stringify (parse (info)), чтобы проверить все атрибуты в информации. Этот класс просто черновой реализации. Может быть некоторые ошибки внутри.

public class NetStreamMetaData
{
    public static function parse(object:Object, isArray:Boolean = false):Object{
        var ret:Object = {};
        if(isArray)
            ret = [];

        var k:String;
        for(k in object){
            if(isNaN(Number(k))){
                if(object[k] is Array){
                    ret[k] = parse(object[k], true);
                }else{
                    ret[k] = object[k];
                }   
            }else{
                if(object[k] is Array){
                    ret.push(parse(object[k], false));
                }else{
                    ret.push(object[k]);
                }
            }
        }
        return ret;
    }
}
...