แยกวิดีโอ MPEG จากบรรทัดคำสั่งหรือไม่


6

ฉันมีดีวีดีโฮมเมดที่ฉันพยายามแทรกบทและจัดเรียงใหม่อย่างมีประสิทธิภาพ - ผู้เขียนดั้งเดิมเขียนมันเป็นบทยาว ๆ หนึ่งบทและฉันต้องการที่จะฉีกมันออกเป็นชิ้นเล็ก ๆ และเข้ารหัสลงในดีวีดีใหม่ ฉันฉีกดีวีดีด้วยคำสั่งต่อไปนี้:

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

ฉันใช้ Gentoo Linux กับ mplayer เวอร์ชัน 1.0-rc2_p20090731 (ล่าสุดมีให้บริการในพอร์เทจ)

ฉันมีรายการเวลาที่บทควรจะขยาย (ตัวอย่าง 30: 11-33: 25) ดังนั้นความคิดแรกของฉันคือการฉีกดีวีดีทั้งหมดและใช้mpgtxเพื่อตัดไฟล์บางส่วนออก ปัญหาของฉันคือการทำงานmpgtx -iกับไฟล์รายงานการกระโดดข้ามเวลาค่อนข้างน้อย:

การประทับเวลาเพิ่มขึ้นจาก 59.753789 เป็น 0.001622 ที่ตำแหน่ง 1d29800
การประทับเวลาเพิ่มขึ้นจาก 204963823030450.343750 เป็น 31.165900 ที่ตำแหน่ง 2d4f800
การประทับเวลาเพิ่มขึ้นจาก 60.077878 เป็น 0.001622 ที่ตำแหน่ง 43cc000 
การประทับเวลาเพิ่มขึ้นจาก 60.024233 เป็น 0.001622 ที่ตำแหน่ง 65c5000
การประทับเวลาเพิ่มขึ้นจาก 204963823068631.718750 เป็น 52.549244 ที่ตำแหน่ง 7fd1000

ฉันพยายามแก้ไขดัชนีโดยใช้:

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

แต่ mpgtx จะยังรายงานปัญหาการประทับเวลา คำถามของฉันทันที: มีวิธีที่จะใช้ภาพยนตร์ ripped ที่ฉันมีและแก้ไขการประทับเวลาเพื่อให้ฉันสามารถตัดมันด้วย mpgtx หรือไม่ หากฉันสามารถทำให้เรื่องนั้นจบลงได้การสร้างส่วนที่เหลือของ DVD จะเป็นการแล่นเรือที่ราบรื่น

หากไม่สามารถแก้ไขการประทับเวลาในไฟล์นี้: มีวิธีที่ดีกว่าในการตัดชิ้นส่วนเล็ก ๆ ของดีวีดีลงในไฟล์แยกกันเพื่อทำการคอมไพล์ใหม่ในภายหลังหรือไม่? ฉันชอบสิ่งนี้มากที่จะทำบน Linux และมันจะดีกว่านี้ถ้าฉันสามารถเขียนสคริปต์ได้ (ฟีดในรายการตำแหน่งเริ่มต้นและสิ้นสุดหรือเริ่มเวลาและระยะเวลาและออกชุด ripped ไฟล์) ถ้าจำเป็นฉันยังมีเครื่อง Mac OS X แต่ไม่มี Windows

แก้ไข:ฉันหาวิธีแก้ปัญหาที่เกี่ยวข้องกับHandBrakeและffmpeg อีกครั้ง (ด้วยความช่วยเหลือจากคำถามนี้ ) แต่คำถามนี้ตั้งอยู่

แก้ไขอีกครั้ง:กลับกลายเป็นว่าโซลูชันอื่น ๆ ของฉันใช้งานไม่ได้จริง ๆ แล้วเสียง desynchronized ประมาณห้าวินาทีหรือประมาณครึ่งหนึ่งของ mpgs ตัดของฉัน - ดังนั้นฉันจึงกลับไปที่สี่เหลี่ยมจัตุรัส ใคร?

คำตอบ:


8

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 วินาที

.


ใช่ ffmpeg ได้พิสูจน์แล้วว่ามีเสถียรภาพมากขึ้นสำหรับฉันกว่า mencoder สำหรับการแยกลำธาร โปรดทราบว่าหากคุณทำให้ทุกเฟรมเป็น i-frame คุณสามารถแยกได้อย่างแม่นยำ: ref: en.wikibooks.org/wiki/Mplayer#Split.2Fsub-section_videosนี่คือรายการที่นี่ยาว: spreadsheets.google.com/ …
rogerdpack

1

ฉันเคยแฮ็คข้อมูลนี้ด้วยกันเพื่อรับวิดีโอดีวีดีแรม:

#! /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คำสั่งที่จำเป็นในการแบ่งไฟล์ออกเป็นชิ้น ๆ


0
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.