0

私はウェブサーバーとノード JS をまったく初めて使用し、このチュートリアルに従って、Intel Edison ボードでストリーミング サーバーを作成し、理解しました。このウェブサイトでこの問題に関する他の投稿を既に読みましたが、私の場合の答えが見つかりませんでした

.js サーバーを起動した後、クライアント ブラウザー [I'm using Chrome] に次のように入力して正しく接続できます: http://192.168.1.31:8888/チュートリアルと同じビデオが表示されます。 . 必要に応じて、アクティブ化することもでき、正常に動作します

しかし、提供されたコードを見てください:

http.createServer(function (req, res) {

    var reqResource = url.parse(req.url).pathname;
    //console.log("Resource: " + reqResource);

    if(reqResource == "/"){

        //console.log(req.headers)
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(indexPage);
        res.end();

    } else if (reqResource == "/favicon.ico"){

        res.writeHead(404);
        res.end();

    } else {

            var total;
            if(reqResource == "/movie.mp4"){
                total = movie_mp4.length;
            } else if(reqResource == "/movie.ogg"){
                total = movie_ogg.length;
            } else if(reqResource == "/movie.webm"){
                total = movie_webm.length;
            } 

            var range = req.headers.range;

            var positions = range.replace(/bytes=/, "").split("-");
            var start = parseInt(positions[0], 10);
            // if last byte position is not present then it is the last byte of the video file.
            var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
            var chunksize = (end-start)+1;

            if(reqResource == "/movie.mp4"){
                res.writeHead(206, { "Content-Range": "bytes " + start + "-" + end + "/" + total, 
                                     "Accept-Ranges": "bytes",
                                     "Content-Length": chunksize,
                                     "Content-Type":"video/mp4"});
                res.end(movie_mp4.slice(start, end+1), "binary");

            } else if(reqResource == "/movie.ogg"){
                res.writeHead(206, { "Content-Range": "bytes " + start + "-" + end + "/" + total, 
                                     "Accept-Ranges": "bytes",
                                     "Content-Length": chunksize,
                                     "Content-Type":"video/ogg"});
                res.end(movie_ogg.slice(start, end+1), "binary");

            } else if(reqResource == "/movie.webm"){
                res.writeHead(206, { "Content-Range": "bytes " + start + "-" + end + "/" + total, 
                                     "Accept-Ranges": "bytes",
                                     "Content-Length": chunksize,
                                     "Content-Type":"video/webm"});
                res.end(movie_webm.slice(start, end+1), "binary");
            }
    }
}).listen(8888);

http://192.168.1.31:8888/movie.mp4のようにクライアントに入力して、 このアドレスを解決し、Chrome クライアントでビデオのスライスを正しく受信できるようにする必要があると思います。問題は、これを実行しようとすると、次のエラーが発生することです。

 var positions = range.replace(/bytes=/, "").split("-");
                                  ^
TypeError: Cannot call method 'replace' of undefined
    at Server.<anonymous> (/home/root/streaming-video-html5/streaming-video-html5/server.js:66:35)
    at Server.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2109:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:122:23)
    at Socket.socket.ondata (http.js:1967:22)

ここから、このエラーが原因であることがわかりましたrange.replace.split undefinedが、なぜですか?

この厄介な問題を解決する方法について何か考えはありますか?

助けようとする人々に前もって感謝します

4

1 に答える 1

0

クライアントがリクエスト ヘッダーで を送信していない可能性がありますrange- 必須ではないので、これを試してください

    var range = req.headers.range;
    var start = 0, end = total - 1;
    if(range) {
        var positions = range.replace(/bytes=/, "").split("-");
        start = parseInt(positions[0], 10);
        // if last byte position is not present then it is the last byte of the video file.
        end = positions[1] ? parseInt(positions[1], 10) : total - 1;
    }

それで直ればいいと思う

于 2015-07-10T04:30:14.293 に答える