web-dev-qa-db-ja.com

nodejsは2つの動画を結合しますか?

したがって、私はコンセプトに取り組んでおり、FFMPEGを使用して必要なことを実行できることを理解している間、nodejsリクエストを使用して別のビデオの最後にビデオを結合する方法があることを望んでいました。

次のコードはオーディオで機能し、使用しているビデオファイルはMP4です(同じビデオを結合しようとしているため、9秒ではなく18秒になるはずです)。

uRL = https://storage.googleapis.com/ad-system/testfolder/Video/10%20second%20video%20FAIL.mp4

const express = require('express');
request = require('request');


const router = new express.Router();

router.get(':url(*)', (req, res) =>{


    var url = req.params.url.substr(1); 
    res.set({
        "Content-Type": "video/mp4",
        'Transfer-Encoding': 'chunked'
    });


    var clients = [];
    ASystem();
    var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    console.log;(req.params.url);
    /* START A FUNCTION */
    function ASystem(){

                var remote = "https://storage.googleapis.com/ad-system/testfolder/Video/10%20second%20video%20FAIL.mp4";
                var streama = request.get(remote);
                streama.on("connect", function() {
                    console.error(" connected!");
                    console.error(streama.headers);
                });

                streama.on("end", function() {
                    console.error(" END");
                    console.log(url);
                   if(url !== ""){getVideo();}
                    console.error(streama.headers);
                // test = true;

                });

                // Fired after the HTTP response headers have been received.
                streama.on('response', function(res) {
                console.error(" Completed");
                    console.error(res.headers);
                });


                // When a chunk of data is received on the stream, Push it to all connected clients
                streama.on("data", function (chunk) {
                        // console.log(clients.length);
                        if (clients.length > 0){
                            for (client in clients){
                                clients[client].write(chunk);
                            };
                        }

                });
    };
/* END A FUNCTION */
/* FETCHING URLVIDEO */
    function getVideo(){
        var remote = url;   
        var streama = request.get(remote);
        streama.on("connect", function() {
            console.error(" Stream connected!");
            //console.error(stream.headers);
        });

        streama.on("end", function() {
            console.error(" Stream END");
        // setTimeout(function(){ test = true; console.error('yep yep yep')},29000);
            //console.error(stream.headers);
        // test = true;
        //getVideo();
        });

        // Fired after the HTTP response headers have been received.
        streama.on('response', function(res) {
        // console.error("Stream response!");
            console.error(res.headers);
        });


        // When a chunk of data is received on the stream, Push it to all connected clients
        streama.on("data", function (chunk) {
                // console.log(clients.length);
                if (clients.length > 0){
                    for (client in clients){
                        clients[client].write(chunk);
                    };
                }

        });

    }
    /* END VIDEO*/

    /* CORE SYSTEM */

      clients.Push(res);

    /* END CORE SYSTEM */
});
module.exports = router;
5
RussellHarrower

ビデオファイルの連結は、オーディオファイルの連結ほど簡単ではありません。メタデータ(タグ、ヘッダー)とその他の注意が必要なもの(両方のビデオの解像度/寸法など)がある

一部の非常に単純なビデオ形式はファイルレベルの連結をサポートしている可能性がありますが、mp4はファイルレベルの連結をサポートしていません

mp3の場合は、単純にファイルを連結できますが、無効なヘッダーや破損したヘッダーが残りますが、ほとんどの場合、再生には影響しません。

確かにあなたはプログラムを書くことができます(またはおそらく誰かがあなたがノードで実行できるライブラリをすでに書いています)ビデオを正しく連結することができますが、いくつかの努力が必要ですが、他の外部ツールなしでそれを行うことは不可能ではありません(単純でもありません)手は、このジョブに非常に成熟していてうまく機能しているFFMPEGの1つを使用して、これをFFMPEGでドット化する方法について詳しく知ることができます この回答を参照

0

OpenGLトランジションを使用してビデオを連結するために使用される ffmpeg-concat と呼ばれるnpmパッケージがあります。これはあなたの目的に役立つかもしれません。

0
WaughWaugh

FFMPEGを使用して、2つ以上のビデオファイルがあるとします。すべてのビデオをダウンロードしてください。 「all_videos.txt」のようなテキストファイルを作成し、次のように1つずつマージするすべてのビデオディレクトリの場所のフルパスを保存します

enter image description here

次に、このコマンドをノードjsで実行します(以下のコマンドで「all_videos.txt」の場所に注意してください)

let cmd = "ffmpeg -f concat -i all_videos.txt -c copy merged_video.mp4"
Exec(cmd, function(err, stdout, stderr) {
  if(err) console.log(err)
  else console.log("Done!")
})
0
wallgeek