【ニコ生】 タイムシフトのFLVを無劣化で連結する

現在(2013年2月時点)では ニコ生のTSを無劣化で連結する Andy's FLV Joiner の方が手軽でより高速に連結できる。

この方法はニコ生のTSの他にYoutubeやyouku等の分割動画にも応用できる。

使用するツールは

FLVMerge
http://orz.s176.xrea.com/download/FLVMerge.zip
起動には .Net framework 2.0 以上が必要

FLVMDIとFLVMDIGUI
真ん中より少し下のDownloadsの所にある
http://www.buraks.com/flvmdi/

以前はMoyea FLV Editor Liteで編集して出力する方法を紹介していたが、ツールのインストールと編集にPCスペックが必要であまり手軽ではなかったので、もっと手軽に連結できるFLVMergeを利用する。

ニコ生のTSファイルが分割される例として配信方法を変える、長時間放送で3時間毎に分割、公式生放送の低画質モード、ニコ生サーバーが不調などだが、今回紹介する連結方法はニコ生サーバーが不調で配信方法が変わらない、つまり放送設定(エンコードオプション)が変わらない場合のTSファイルを連結する。

FLVMergeの使い方はreadme.txtに書いてあるが

コマンドプロンプトから
flvmerge filename1.flv filename2.flv
でmerge.flvがカレントフォルダに出力されます。



なので入力ファイル名を設定して.batで保存し.batを実行する。するとコンソールが開いて文字が大量に流れるがしばらく待つと連結前の動画と同じ場所にmerge.flvで動画が出力される。

次にできあがった動画を再生してみると、動画時間が連結した時間以降が表示されないのでFLVMDIでメタデータを修正する。

flvmdi.exeとflvmdigui.exeを同じフォルダに置いてflvmdigui.exeを実行し入力と出力を指定し、オプションは何もチェックを入れずにRun FLVMDIを押してしばらくすると動画が出力される。これで連結されたTSができあがる。

この連結方法はニコ生の各TSのフォーマットH.263/Nellymoser,VP6/MP3,H.264/MP3に対応していて、映像の最初に音声だけで動画が出力されていない動画を連結しても音ずれなく連結できる。

追記 2011/02/08
FLVMergeとFLVMDIはともにコマンドラインから使えるので一度に処理する方法

flvmdi でヘッダを編集前後のファイルを残すなら merge_fix.flv をつけて、残さないのなら merge_fix.flv を消せば merge.flv がヘッダを編集した動画として出力される。

flvmerge 1.flv 2.flv
flvmdi merge.flv merge_fix.flv



そのほかに連結ツールとしてunitemovieやMovieOperatorが有名だがニコ生のTSだとエラーが出るみたい。
http://red.sakura.ne.jp/~anonymouse/unitemovie_download.html
http://www.gigafree.net/media/me/movieoperator.html

関連記事
【タイムシフト】 ニコ生のTS(FLV H.264/MP3)を編集、エンコードする方法
【ニコ生】 ライブストリーミングの動画を編集・エンコードする 【Ust】
関連記事

コメント

-

スクルプト化
ドラッグ&ドロップで手軽に実行できるようにスクルプトにしてみました。
※exeパスの修正が必要

以下VBS --------------------------------------------

Const FLV_MERGE_EXE = "?:\?????\FLVMerge.exe"
Const FLV_MDI_EXE = "?:\?????\flvmdi.exe"
Const MERGE_FILE = "merge.flv"

Dim Param
Set Param = WScript.Arguments
If Param.Count < 2 Then
Set Param = Nothing
WScript.Quit
End If

Dim Fs
Set Fs = CreateObject("Scripting.FileSystemObject")
Dim Shell
Set Shell = CreateObject("WScript.Shell")

Dim file_path
file_path = Left(Param(0), Len(Param(0))-Len(Fs.GetFileName(Param(0))))

Shell.CurrentDirectory = file_path

Dim aList(), cnt, p1, i
cnt = 0
For Each p1 In Param
p1 = Fs.GetFileName(p1)
ReDim Preserve aList(cnt)
If cnt > 0 Then
For i = cnt-1 To 0 Step -1
If StrComp(aList(i), p1) > 0 Then
aList(i+1) = aList(i)
Else
aList(i+1) = p1
Exit For
End If
Next
If i < 0 Then
aList(i+1) = p1
End If
Else
aList(cnt) = p1
End If

cnt = cnt + 1
Next

Dim input_files, sData
input_files = ""
For Each sData In aList
input_files = input_files & " """ & sData & """"
Next

Shell.Run FLV_MERGE_EXE & input_files, 6, True

Dim file1, file2, output_file
file1 = Fs.GetFileName(Param(0))
file2 = Fs.GetFileName(Param(1))
For i=1 To Len(file1)
If StrComp(Left(file1, i), Left(file2, i)) <> 0 Then
Exit For
End If
Next
output_file = Left(file1, i-1)
Dim right1
right1 = Right(output_file, 1)
If right1 = "-" Or right1 = "‐" Or _
right1 = "_" Or right1 = "_" Or _
right1 = "(" Or right1 = "(" Then
output_file = Left(output_file, Len(output_file)-1)
End If
output_file = output_file & ".flv"

Shell.Run FLV_MDI_EXE & " " & MERGE_FILE & " " & output_file, 6, True
Fs.DeleteFile MERGE_FILE

Set Param = Nothing
Set Fs = Nothing
Set Shell = Nothing

ロベルト

Re: スクルプト化
スクリプトありがどうございます。

vbsは読めませんが試してみたことろ、ファイル名によっては上書きされたり、何も起こらなかったりするようです。

1.flv 2.flv 出力は .flv

ただし
a.flv, a (2).flv だと a.flv に上書きされる
a (1).flv, a (2).flv だと何も起こらない
非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

当ブログは、Amazonアソシエイトに参加しています。