web-dev-qa-db-ja.com

コマンドラインからMPEGビデオを分割しますか?

チャプターを効果的に挿入して再配置しようとしている自家製のDVDがあります。元の作者はそれを1つの長いチャプターとして焼き付けました。それを小さな断片に裂いて、新しいDVDに再エンコードしたいと思います。次のコマンドでDVDをリッピングしました。

mplayer dvd:// -dvd-device/dev/sr2 -dumpstream -dumpfile raw.vob

GentooLinuxをmplayerバージョン1.0-rc2_p20090731(Portageで入手可能な最新のもの)で実行しています。

チャプターがまたがるはずの時間のリストがあるので(たとえば30:11-33:25)、最初に考えたのはDVD全体をリッピングし、 mpgtx を使用して特定の部分を切り出すことでした。ファイルの。私の問題は、ファイルでmpgtx -iを実行すると、かなりの数のタイムスタンプジャンプが報告されることです。

タイムスタンプは位置1d29800 
で59.753789から0.001622にジャンプしました。タイムスタンプは位置2d4f800 
で204963823030450.343750から31.165900にジャンプしました。タイムスタンプは位置43cc000 
で60.077878から0.001622にジャンプしました。位置65c5000で0.001622に
タイムスタンプが位置7fd1000で204963823068631.718750から52.549244にジャンプしました

私は以下を使用してインデックスを修正しようとしました:

mencoder raw.vob -oac copy -ovc copy -forceidx -o fixed.vob -of mpeg

ただし、mpgtxは引き続きタイムスタンプの問題を報告します。私の当面の質問:私が持っているリッピングされた映画を取り、そのタイムスタンプを修正して、mpgtxでカットできるようにする方法はありますか?その1つの問題を解決できれば、DVDの残りの部分を作成することはスムーズに進むでしょう。

このファイルのタイムスタンプを修正できない場合:後で再コンパイルするためにDVDの小さなチャンクを別々のファイルにリッピングするより良い方法はありますか? Linuxでこれを実行したいのですが、なんらかの方法でスクリプトを作成できればさらに良いでしょう(開始位置と終了位置、または開始時間と期間のリストを入力して、一連のリッピングを取得します)。ファイル)。必要に応じて、Mac OS Xマシンも利用できますが、Windowsはありません。

編集:HandBrakeffmpeg (-の助けを借りて)を含む別の解決策を見つけることになりました この質問 )、しかし質問は立っています。

もう一度編集してください:他の解決策がうまく機能しなかったことがわかりました-私のカットmpgsの約半分でオーディオが約5秒非同期になりました-だから私は正方形に戻ります。誰でも?

6
Tim

FFmpegがこれを行います。

コマンドは次のようになります。

コード:ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ssは、ビデオファイルの先頭からのhh:mm:ssの開始点です。

-tは、新しいセグメントのhh:mm:ss単位の時間の長さです。

したがって、上記の例では、元のファイルの先頭から10秒で開始し、30秒後に終了します。

1回のパスで複数のパーツを作成する場合は、次のように機能します。

コード:ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss 00:00:35 -t 00:00:30 out2.mpgこの例では、最初のセグメントは最初の例と同じですが、35秒から始まり30秒の長さの2番目のファイルも作成しています。

8
TomB

私はかつてDVD-RAMのビデオを入手するためにこれを一緒にハッキングしました:

#! /usr/bin/Ruby -w

a = [0, 0x37f9800, 0xf3e1800]

filename = "input.vob"

a.each_with_index{|seq_start, i|
  if seq_start % 1024 != 0 then
    puts "Error: Blocksize doesn't match 1024"
  end

  seq_end = a[i+1]

  if seq_end then
    puts "dd if=#{filename} of=chapter#{i+1}.mpeg bs=1024 skip=#{seq_start/1024} count=#{(seq_end - seq_start)/1024}"
  else
    puts "dd if=#{filename} of=chapter#{i+1}.mpeg bs=1024 skip=#{seq_start/1024}"
  end
}

a変数は、ジャンプが発生する位置の値を取得し、ddを使用してファイルをそれらの位置で断片にスライスします。記録が停止および再開されるたびにジャンプが発生したため、結果はチャプターごとに個別のmpegファイルになります。結果のmpegファイルはジャンプフリーになり、通常どおりに処理できます。

スクリプト自体は実際にはddを呼び出さず、ファイルを細かく分割するために必要なddコマンドを出力するだけです。

1
Grumbel
num=1
offset=0
divide="Title:"
divide="Chapter:"
input="VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB|VTS_01_5.VOB|VTS_01_6.VOB" 
#|VTS_01_7.VOB|VTS_01_8.VOB|VTS_01_9.VOB"

for len in $(lsdvd -c VIDEO_TS | grep "$divide" | awk -F' +|,' '/Length:/ { print $5 }')
do
 ss=$(date -u -d "@$offset" +%T.%3N)

 echo $num $ss $len
 cd VIDEO_TS
 #ffmpeg -ss $ss -i "concat:$input" -t $len -c copy ../$(printf "%02d" $num).VOB 2>/dev/null
 ffmpeg -ss $ss -i "concat:$input" -map 0:1 -map 0:3 -t $len -acodec copy -vcodec libx264 ../$(printf "%02d" $num).mp4 2>/dev/null
 cd ..

 len=$(date -u -d "1970-01-01 $len" +%s.%3N)
 offset=$( echo "$offset + $len" | bc )
 num=$((num+1))
done
0
user1855805