
저는 집에서 만든 DVD를 가지고 있는데 효과적으로 챕터를 삽입하고 재배열하려고 합니다. 원저자가 그것을 하나의 긴 챕터로 구워서 더 작은 조각으로 찢어서 새 DVD에 다시 인코딩하고 싶습니다. 다음 명령을 사용하여 DVD를 리핑했습니다.
mplayer dvd:// -dvd-device /dev/sr2 -dumpstream -dumpfile raw.vob
저는 mplayer 버전 1.0-rc2_p20090731(포티지에서 사용 가능한 최신 버전)의 Gentoo Linux를 실행하고 있습니다.
각 챕터에 걸쳐 있어야 하는 시간 목록(예: 30:11-33:25)이 있으므로 처음에는 DVD 전체를 찢어서 사용하자는 생각이 들었습니다.mpgtx파일의 특정 부분을 잘라냅니다. 내 문제는 mpgtx -i
파일을 실행하면 꽤 많은 타임스탬프 점프가 보고된다는 것입니다.
타임스탬프가 1d29800 위치에서 59.753789에서 0.001622로 점프했습니다. 타임스탬프가 2d4f800 위치에서 204963823030450.343750에서 31.165900으로 점프했습니다. 타임스탬프가 43cc000 위치에서 60.077878에서 0.001622로 점프했습니다. 타임스탬프가 65c5000 위치에서 60.024233에서 0.001622로 점프했습니다. 타임스탬프가 7fd1000 위치에서 204963823068631.718750에서 52.549244로 점프했습니다.
다음을 사용하여 인덱스를 수정하려고 했습니다.
mencoder raw.vob -oac 복사 -ovc 복사 -forceidx -o 고정.vob -of mpeg
그러나 mpgtx는 여전히 타임스탬프 문제를 보고합니다. 즉각적인 질문: 제가 가지고 있는 찢어진 영화를 가져와 타임스탬프를 수정하여 mpgtx로 잘라낼 수 있는 방법이 있습니까? 그 한 가지 문제만 해결하면 DVD의 나머지 부분도 순조롭게 제작할 수 있을 것입니다.
이 파일의 타임스탬프를 수정할 수 없는 경우 나중에 다시 컴파일하기 위해 DVD의 작은 부분을 별도의 파일로 추출하는 더 좋은 방법이 있습니까? 저는 이 작업을 Linux에서 수행하고 싶습니다. 어떻게든 스크립트를 작성할 수 있다면 더 좋을 것입니다(시작 및 종료 위치 목록을 입력하거나 시작 시간 및 기간을 입력하고 일련의 찢어진 부분을 꺼낼 수 있음). 파일). 필요하다면 Mac OS X 시스템도 사용할 수 있지만 Windows는 없습니다.
편집하다:나는 다른 해결책을 찾았습니다.수동 브레이크그리고ffmpeg(의 도움으로이 질문) 그러나 질문은 유효합니다.
다시 편집하세요:내 다른 솔루션이 제대로 작동하지 않은 것으로 나타났습니다. 오디오가 약 5초 동안 비동기화되었으며, 이는 내 잘라낸 mpgs의 약 절반에서 다시 원점으로 돌아갑니다. 누구나?
답변1
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초 후에 끝나는 것입니다.
한 번에 여러 부품을 생성하려면 다음이 작동해야 합니다.
코드: 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
나는 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
답변3
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