M3U8ファイル形式を解決nodejs使用し、TSでMP4にマージ
ビデオを見て前に、ラベルを直接ビデオに、ビデオ・アドレスを表示し、それをダウンロードしてください。。
それは次のように、要素のタブの多くはオープンビデオレビューすることを発見しました。
ブロブのものはそれをダウンロードすることができない、始めました。。。
実際には、我々はまだ、オープンなネットワークを参照してください.TSファイルの束をロードすることができます。実際には、.TSファイルは、ビデオのセクションにカットすることです。理論的には、これらのファイルがダウンロードされ、その後、合併、完成し,,,
Wordの理論、何千行ものコード...
まず、問題
1、どのくらいの最後にファイルをTSとのアドレスから来ます。。。
答え:TS-関連情報のM3U8と呼ばれるファイルがあります。ネットワークがある場合は注意深い観察のポイントは、要求のファイルで見つけることができます。次のようにファイルの内容は次のとおりです。
この文書では、明らかに、当然のことながら、完全なアドレスが存在し、各TSのファイル名を保存します。。TSのみファイル名の内側に、プラス宛先サイトのドメイン名を抽出する必要があり、あなたがダウンロードすることができます。。
私は手動でローカルにダウンロードM3U8ためにここにいます、もちろん、あなたがM3U8をダウンロードするための独自のスクリプトファイルを書き込むことができます
次のように解析するコードは次のとおりです。
CONSTのfs =は( "FS")を必要とします。 VAR源= fs.readFileSync(」./ test.m3u8" 、 "UTF-8"); //读取M3U8 VAR ARR = source.split( "\ n")を。 ARR = arr.filter((アイテム)=> { 。item.matchを返す(/ \ TS $ /); });
2、どのような技術は、これらのTSを結合します
ここで私は2つのアプローチを試してみました
最初:ノードjsが直接一つのファイルに、ファイルストリームを使用して読み取ります。。。最終的な結果は、合併は確かに成功ですが、またプレーするが、カトン現象は、ビデオフレームが破棄されるべきです。
第二:強力なツールを使用して、ffmpegのは、成功をマージします。特定のffmpegのインストールここを見て:https://www.cnblogs.com/xswl/p/10042195.html
私は、次の3つのカテゴリに見つけるffmpegの映像合成指示:
ffmpegの-i "CONCAT:1.ts | 2.ts" -acodecコピーout.mp3
ffmpegの-i "CONCAT:1.ts | 2.ts" -acodecコピー-vcodecコピーを-absf aac_adtstoasc output.mp4
最初の2つのカテゴリが、CMDコマンドの長さが制限されて検討し,,ファイル名内の指示に接合されることになるので、私は使用しませんでした。
以下の方法を使用してファイルを入力します。
-acodecコピー-vcodecコピーINPUT.TXTのffmpegの-i -absf aac_adtstoasc output.mp4
次のように入力構成ファイルでINPUT.TXTは、ファイル名の内容は、マージされます。
ffconcatバージョン1.0 ファイル0.ts ファイル1.ts
第二に、正式スタート
新down.jsは書いています:
必要=一定( "要求")を要求し、 CONSTザは、FS =( "FS")を必要とする; constが必要パス( "パス")=; CONSTは=( 'child_process')必要child_process; CONST = fsextra(必要'fsextra' ); module.exportsは=関数(OPT){ オプションオプション|| = {}; VAR opt.arr || ARR = []; //すべてのファイル名またはアドレスは、TS VARホスト= opt.hostを|| ""。 //既に要素が含まれていARRが通過していない可能性がある場合、TSドメインをダウンロード するvar outputName = opt.name || `出力$ {(新しいDate())getTime()。} mp4` ;. // エクスポートされたビデオを名前 のconst = tsFileのpath.join(__ dirnameは、 `/ソース/ $ {ARR [0] .split()[0]「「。}` ,.); createDir(tsFile); //再帰的にファイルを作成 CONSOLE.LOGを( "この暫定リソースファイル:"、tsFile); constのresultDir = path.join(__ dirnameは、 "./結果"); createDir(resultDir); //再帰的にファイルを作成します resultFile path.join =一定(resultDir、outputName); localPathにVAR = []; //ローカルパスにダウンロード //ファイルTSダウンロードが開始 (ロード) 機能ロード(){ (arr.length> 0){IF VAR arr.shift = U(); VARホストのURL = U +; はconsole.log( "進行---:"、URL); ダウン(URL); }他{ //ダウンロードが完了すると はconsole.log(「ダウンロードが完了- -コンフィギュレーションの生成を開始"); localPath.unshift(" ffconcatバージョン1.0 "); 試み{ fs.writeFileSync(path.join(tsFile、" ./ INPUT.TXT ")、localPath.join(" \ N- ")、未定義、 'UTF-8') }キャッチ(E){ にconsole.log( "エラー書き込み構成- "、E); 返す; } 構成に依存合成開始// コンソール。ログ(「-----始動を合成」)。 child_process.exec( `$ {CD} && tsFile FFmpegの-i INPUT.TXT -acodecコピーコピー-absf aac_adtstoasc -vcodec resultFile} {$ '、関数(誤差、標準出力、標準エラー){ IF(エラー){ console.error( "合成失敗---"、エラー); }他{ はconsole.log( "成功の合成- "、STDOUT); //削除、一時ファイルが fsextra.remove(tsFile、ERR => { IF(ERR)コンソールを返します。エラー( "ファイルを削除できなかった"、ERR) はconsole.log( 'ファイルが正常に削除された!') }); } }); } } // TSファイルのダウンロード 機能ダウン(URL){ VARのP = url.split( " ? ")[0]; VAR = path.parse NM(P); VAR = NMEのNM ["名前"] + NM [" EXT「]; RPATH =パス。(tsFile、NME)に参加。 localPath.push( `ファイル$ {NME} `); // 合成のためのローカルキャッシュパス 要求({ URL:URL、 ヘッダ:{ ' -エージェントユーザー':「のMozilla / 5.0(Windows NTの6.1; WOW64)のAppleWebKit /537.36(KHTML、ヤモリ等)クローム/ 71.0.3578.98サファリ/ 537.36 ' 'X-With-要求':'のXMLHttpRequest ' } }、関数(ERR応答、本体){ !IF(ERR = && Response.StatusCode 200 =である){ ロード(); } {他 はconsole.log( "エラー"、ERR) } })管(fs.createWriteStream(RPATHが));. } //フォルダを作成再帰 関数mkdirs(DIRPATHである){ IF (!fs.existsSync(path.dirname(DIRPATH))){ mkdirs(パス。DIRNAME(DIRPATH))。 } FS。mkdirSync(DIRPATH)。 } 関数createDir(MYPATH){ fs.existsSync(MYPATH)==偽&& mkdirs(MYPATH)。 } } // ffmpegの-i "CONCAT:1.ts | 2.ts" out.mp3 -acodecコピー // ffmpegの-i "CONCAT:1.ts | 2.ts" -vcodecコピー-absf aac_adtstoasc出力をコピー-acodec .MP4 // ffmpegの-i INPUT.TXT -acodecは-vcodecコピー-absf aac_adtstoasc output.mp4コピー / * ffconcatバージョン1.0 ファイル0.ts ファイル1.tsを * / / * //文件移动 関数MOVEFILE(OLDPATH、NEWPATH) { {試みる fs.renameSync(OLDPATH、NEWPATH)。 } キャッチ(E){ にconsole.log( "报错后强制移动"、E)。 fs.renameSync(OLDPATH、NEWPATH)。 } * /
そして、main.jsを作成
CONSTのfs =は( "FS")を必要とします。 =ダウンCONST( "ダウン./")が必要です。 VARホスト= 'https://でXXXX /';目标网站 するvar outputName = "output.mp4"。 VAR源= fs.readFileSync(」./ test.m3u8" 、 "UTF-8"); //读取M3U8 VAR ARR = source.split( "\ n")を。 ARR = arr.filter((アイテム)=> { 。item.matchを返す(/ \ TS $ /); }); ダウン({ ARR、 ホスト、 outputName })
FS-余分なモジュールに使用され、インストール
海面と余分な-FS以上
最後の実行:
ノードmain.js