แบ่งไฟล์วิดีโอ. mov ขนาดใหญ่โดยอัตโนมัติเป็นไฟล์ขนาดเล็กที่เฟรมสีดำ (เปลี่ยนฉาก) หรือไม่


11

ฉันมีไฟล์วิดีโอ 65 .mov ชื่อ tape_01.mov, tape_02.mov, ... , tape_65.mov แต่ละรายการมีความยาวประมาณ 2.5 ชั่วโมงและใช้เวลาหลายกิกะไบต์ พวกเขาเป็นสำเนาดิจิทัลของเทป VHS (ภาพยนตร์บ้านของครอบครัวฉัน)

แต่ละไฟล์วิดีโอ 2.5 ชั่วโมง .mov มี "บท" มากมาย (ในแง่ที่บางครั้งฉากจบลงด้วยการจางหายไปเป็นหน้าจอสีดำและจากนั้นฉากใหม่ก็จะจางหายไป)

เป้าหมายหลักของฉันคือมี 65 ไฟล์ขนาดใหญ่หั่นเป็นไฟล์เล็กลงตามบท และฉันต้องการให้ทำโดยอัตโนมัติผ่านการตรวจจับเฟรมสีดำระหว่าง "ฉาก"

ฉันสามารถใช้ ffmpeg (หรืออะไรก็ได้) เพื่อส่งต่อในชื่อไฟล์เดิม 65 ไฟล์และให้มันวนซ้ำโดยอัตโนมัติในแต่ละวิดีโอแล้วตัดมันลงโดยตั้งชื่อชิ้นส่วนผลลัพธ์เทป _01-ch_01.mov, tape_01-ch_02.mov, เทป etc? และฉันต้องการให้มันทำโดยไม่ต้องเข้ารหัสใหม่ (ฉันต้องการให้มันเป็นชิ้นที่ไม่มีการสูญเสียอย่างง่าย)

ฉันจะทำสิ่งนี้ได้อย่างไร

นี่คือขั้นตอนที่ฉันต้องการ:

  1. ทำซ้ำผ่านโฟลเดอร์ของไฟล์. mov (ชื่อ tape_01.mov, tape_02.mov, ... , tape_65.mov) เพื่อส่งออกเป็นไฟล์ mp4 (ชื่อ tape_01.mp4, tape_02.mp4, ... , tape_65.mp4) . ฉันต้องการให้การตั้งค่าการบีบอัดนั้นง่ายต่อการกำหนดค่าสำหรับขั้นตอนนี้ ไฟล์. mov ดั้งเดิมควรยังคงอยู่หลังจากสร้างไฟล์. mp4
  2. ทำซ้ำไฟล์ mp4: สำหรับไฟล์ mp4 แต่ละไฟล์สร้างไฟล์ข้อความที่ระบุเวลาเริ่มต้นและระยะเวลาของเซ็กเมนต์สีดำระหว่าง "ฉาก" mp4 แต่ละตัวสามารถแบ่งฉากสีดำได้ 0 หรือมากกว่านั้น เวลาและระยะเวลาเริ่มต้นควรแม่นยำถึงเสี้ยววินาที HH: MM: รูปแบบ SS ไม่แม่นยำเพียงพอ
  3. จากนั้นฉันจะสามารถตรวจสอบไฟล์ข้อความเหล่านี้ด้วยตนเองอีกครั้งเพื่อดูว่าพวกเขาระบุการเปลี่ยนแปลงของฉากได้อย่างถูกต้องหรือไม่ (เซ็กเมนต์สีดำ) ฉันสามารถปรับการกำหนดเวลาได้ถ้าต้องการ
  4. สคริปต์อื่นจะอ่านไฟล์ mp4 แต่ละไฟล์และไฟล์ txt และแยก (อย่างรวดเร็วและไม่สูญเสีย) mp4 เป็นหลาย ๆ ชิ้นตามที่จำเป็นตามบรรทัดของไฟล์ข้อความ (เวลาที่ระบุ) รอยแยกควรเกิดขึ้นตรงกลางของแต่ละส่วนสีดำ นี่คือตัวอย่างไฟล์ mp4 (ที่มีการลบเสียงเพื่อความเป็นส่วนตัว) ที่มีการเปลี่ยนฉากเป็นสีดำจาง ไฟล์ mp4 ดั้งเดิมไม่ควรถูกแตะต้องเนื่องจากไฟล์ mp4 ขนาดเล็กถูกสร้างขึ้น ไฟล์ mp4 ขนาดเล็กควรมีรูปแบบการตั้งชื่อของ tape_01_001.mp4, tape_01_002.mp4, tape_01_003.mp4 เป็นต้น
  5. โบนัส! มันจะยอดเยี่ยมถ้าสคริปต์อื่นสามารถย้ำเหนือไฟล์ mp4 ขนาดเล็กและสร้างหนึ่ง. png อิมเมจสำหรับแต่ละอันที่เป็นภาพหน้าจอเหมือนที่บุคคลนี้พยายาม: ภาพย่อที่มีความหมายสำหรับวิดีโอโดยใช้ FFmpeg

ฉันต้องการให้สคริปต์เหล่านี้เป็นสคริปต์เชลล์ที่ฉันสามารถทำงานใน Mac, Ubuntu และ Windows Git Bash

คำตอบ:


11

ต่อไปนี้เป็นสคริปต์ PowerShell สองตัวเพื่อแยกวิดีโอขนาดยาวเป็นบทย่อย ๆ ด้วยฉากสีดำ

บันทึกเป็น Detect_black.ps1 และ Cut_black.ps1 ดาวน์โหลดffmpeg สำหรับ Windowsและบอกสคริปต์เกี่ยวกับเส้นทางไปยัง ffmpeg.exe และโฟลเดอร์วิดีโอของคุณในส่วนตัวเลือก

ป้อนคำอธิบายรูปภาพที่นี่

สคริปต์ทั้งสองจะไม่แตะไฟล์วิดีโอที่มีอยู่โดยจะไม่มีการแตะต้อง
อย่างไรก็ตามคุณจะได้รับไฟล์ใหม่สองไฟล์ในที่เดียวกับที่คุณใส่วิดีโอ

  • ล็อกไฟล์ต่อวิดีโอที่มีเอาต์พุตคอนโซลสำหรับทั้งคำสั่ง ffmpeg ที่ใช้
  • ไฟล์ CSV ต่อวิดีโอที่มีการประทับเวลาทั้งหมดของฉากสีดำสำหรับการปรับจูนแบบแมนนวล
  • วิดีโอใหม่สองสามรายการขึ้นอยู่กับจำนวนฉากสีดำที่ตรวจพบก่อนหน้านี้

ป้อนคำอธิบายรูปภาพที่นี่


สคริปต์แรกที่เรียกใช้: Detect_black.ps1

 ### Options __________________________________________________________________________________________________________
$ffmpeg = ".\ffmpeg.exe"            # Set path to your ffmpeg.exe; Build Version: git-45581ed (2014-02-16)
$folder = ".\Videos\*"              # Set path to your video folder; '\*' must be appended
$filter = @("*.mov","*.mp4")        # Set which file extensions should be processed
$dur = 4                            # Set the minimum detected black duration (in seconds)
$pic = 0.98                         # Set the threshold for considering a picture as "black" (in percent)
$pix = 0.15                         # Set the threshold for considering a pixel "black" (in luminance)

### Main Program ______________________________________________________________________________________________________

foreach ($video in dir $folder -include $filter -exclude "*_???.*" -r){

  ### Set path to logfile
  $logfile = "$($video.FullName)_ffmpeg.log"

  ### analyse each video with ffmpeg and search for black scenes
  & $ffmpeg -i $video -vf blackdetect=d=`"$dur`":pic_th=`"$pic`":pix_th=`"$pix`" -an -f null - 2> $logfile

  ### Use regex to extract timings from logfile
  $report = @()
  Select-String 'black_start:.*black_end:' $logfile | % { 
    $black          = "" | Select  start, end, cut

    # extract start time of black scene
    $start_s     = $_.line -match '(?<=black_start:)\S*(?= black_end:)'    | % {$matches[0]}
    $start_ts    = [timespan]::fromseconds($start_s)
    $black.start = "{0:HH:mm:ss.fff}" -f ([datetime]$start_ts.Ticks)

    # extract duration of black scene
    $end_s       = $_.line -match '(?<=black_end:)\S*(?= black_duration:)' | % {$matches[0]}
    $end_ts      = [timespan]::fromseconds($end_s)
    $black.end   = "{0:HH:mm:ss.fff}" -f ([datetime]$end_ts.Ticks)    

    # calculate cut point: black start time + black duration / 2
    $cut_s       = ([double]$start_s + [double]$end_s) / 2
    $cut_ts      = [timespan]::fromseconds($cut_s)
    $black.cut   = "{0:HH:mm:ss.fff}" -f ([datetime]$cut_ts.Ticks)

    $report += $black
  }

  ### Write start time, duration and the cut point for each black scene to a seperate CSV
  $report | Export-Csv -path "$($video.FullName)_cutpoints.csv" –NoTypeInformation
}

มันทำงานยังไง

สคริปต์แรกจะวนซ้ำผ่านไฟล์วิดีโอทั้งหมดที่ตรงกับส่วนขยายที่ระบุและไม่ตรงกับรูปแบบ*_???.*เนื่องจากมีการตั้งชื่อวิดีโอบทใหม่<filename>_###.<ext>และเราต้องการแยกไฟล์ออก

มันค้นหาฉากสีดำทั้งหมดและเขียนเวลาเริ่มต้นและระยะเวลาฉากสีดำไปยังไฟล์ CSV ใหม่ที่ชื่อว่า <video_name>_cutpoints.txt

cutpoint = black_start + black_duration / 2นอกจากนี้ยังคำนวณจุดตัดดังแสดง: หลังจากนั้นวิดีโอจะแบ่งกลุ่มตามการประทับเวลาเหล่านี้

ไฟล์ cutpoints.txt สำหรับวิดีโอตัวอย่างของคุณจะแสดง:

start          end            cut
00:03:56.908   00:04:02.247   00:03:59.578
00:08:02.525   00:08:10.233   00:08:06.379

หลังจากวิ่งคุณสามารถจัดการกับจุดตัดได้ด้วยตนเองหากต้องการ หากคุณเรียกใช้สคริปต์อีกครั้งเนื้อหาเก่าทั้งหมดจะถูกเขียนทับ ระวังเมื่อแก้ไขด้วยตนเองและบันทึกงานของคุณที่อื่น

สำหรับตัวอย่างวิดีโอคำสั่ง ffmpeg เพื่อตรวจจับฉากสีดำคือ

$ffmpeg -i "Tape_10_3b.mp4" -vf blackdetect=d=4:pic_th=0.98:pix_th=0.15 -an -f null

มีหมายเลขสำคัญ 3 หมายเลขซึ่งสามารถแก้ไขได้ในส่วนตัวเลือกของสคริปต์

  • d=4 หมายถึงตรวจพบเฉพาะฉากสีดำที่ยาวเกิน 4 วินาที
  • pic_th=0.98 เกณฑ์ในการพิจารณารูปภาพเป็น "สีดำ" (เป็นเปอร์เซ็นต์)
  • pix=0.15ตั้งค่าขีด จำกัด สำหรับการพิจารณาพิกเซลเป็น "ดำ" (ในความสว่าง) เนื่องจากคุณมีวิดีโอ VHS เก่าคุณจึงไม่มีฉากสีดำสนิทในวิดีโอของคุณ ค่าเริ่มต้นที่ 10 จะไม่ทำงานและฉันต้องเพิ่มเกณฑ์เล็กน้อย

ถ้ามีอะไรผิดพลาดตรวจสอบ logfile <video_name>__ffmpeg.logที่สอดคล้องกันที่เรียกว่า หากไม่พบบรรทัดต่อไปนี้ให้เพิ่มหมายเลขที่กล่าวถึงข้างต้นจนกระทั่งคุณตรวจพบฉากสีดำทั้งหมด:

[blackdetect @ 0286ec80]
 black_start:236.908 black_end:242.247 black_duration:5.33877



สคริปต์ที่สองที่จะเรียกใช้: cut_black.ps1

### Options __________________________________________________________________________________________________________
$ffmpeg = ".\ffmpeg.exe"            # Set path to your ffmpeg.exe; Build Version: git-45581ed (2014-02-16)
$folder = ".\Videos\*"              # Set path to your video folder; '\*' must be appended
$filter = @("*.mov","*.mp4")        # Set which file extensions should be processed

### Main Program ______________________________________________________________________________________________________

foreach ($video in dir $folder -include $filter -exclude "*_???.*" -r){

  ### Set path to logfile
  $logfile = "$($video.FullName)_ffmpeg.log"

  ### Read in all cutpoints from *_cutpoints.csv; concat to string e.g "00:03:23.014,00:06:32.289,..."  
  $cuts = ( Import-Csv "$($video.FullName)_cutpoints.csv" | % {$_.cut} ) -join ","

  ### put together the correct new name, "%03d" is a generic number placeholder for ffmpeg
  $output = $video.directory.Fullname + "\" + $video.basename + "_%03d" + $video.extension

  ### use ffmpeg to split current video in parts according to their cut points
  & $ffmpeg -i $video -f segment -segment_times $cuts -c copy -map 0 $output 2> $logfile        
}

มันทำงานยังไง

สคริปต์ที่สองทำซ้ำไฟล์วิดีโอทั้งหมดในลักษณะเดียวกับที่สคริปต์ตัวแรกทำ มันอ่านได้เฉพาะในการประทับเวลาตัดจากความสอดคล้องcutpoints.txtของวิดีโอ

ถัดไปจะรวมชื่อไฟล์ที่เหมาะสมสำหรับไฟล์ตอนและบอก ffmpeg ให้แบ่งเซกเมนต์วิดีโอ ขณะนี้วิดีโอถูกตัดแบ่งโดยไม่มีการเข้ารหัสซ้ำ (เร็วมากและไม่สูญเสียข้อมูล) ด้วยเหตุนี้อาจมีความไม่ถูกต้อง 1-2 วินาทีกับการประทับเวลาของจุดตัดเนื่องจาก ffmpeg สามารถตัดที่ key_frames เท่านั้น เนื่องจากเราเพิ่งคัดลอกและไม่เข้ารหัสใหม่เราจึงไม่สามารถแทรก key_frames ด้วยตัวเราเอง

คำสั่งสำหรับวิดีโอตัวอย่างจะเป็น

$ffmpeg -i "Tape_10_3b.mp4" -f segment -segment_times "00:03:59.578,00:08:06.379" -c copy -map 0 "Tape_10_3b_(%03d).mp4"

หากมีสิ่งใดผิดพลาดให้ดูที่ ffmpeg.log ที่เกี่ยวข้อง



อ้างอิง



ทำ

  • ถาม OP ว่ารูปแบบ CSV นั้นดีกว่าไฟล์ข้อความเป็นไฟล์จุดตัดหรือไม่ดังนั้นคุณสามารถแก้ไขด้วย Excel ได้ง่ายขึ้น
    »นำไปใช้
  • ใช้วิธีการจัดรูปแบบการประทับเวลาเป็น [hh]: [mm]: [ss], [มิลลิวินาที] แทนที่จะใช้เวลาเพียงไม่กี่วินาที
    »นำไปใช้
  • ใช้คำสั่ง ffmpeg เพื่อสร้างไฟล์ mosaik png สำหรับแต่ละบท
    »นำมาใช้
  • อธิบายอย่างละเอียดว่า-c copyเพียงพอสำหรับสถานการณ์ของ OP หรือเราจำเป็นต้องเข้ารหัสใหม่ทั้งหมด
    ดูเหมือนว่าไรอันอยู่ในนั้นแล้ว

ช่างเป็นคำตอบที่ทั่วถึง! ฉันรู้สึกทราบซึ้ง! น่าเสียดายที่ฉันใช้ mac ตอนนี้และจะต้องหาวิธีการแปลเป็น Bash ก่อน
Ryan

ฉันไม่สามารถใช้งาน PowerShell ได้เลย ไฟล์บันทึกยังคงว่างเปล่า
Ryan

ฉันจะเห็นสิ่งที่ฉันสามารถอัปโหลดเพื่อเป็นประโยชน์ คอยติดตาม. ขอบคุณสำหรับความสนใจของคุณ!
Ryan

ฉันเพิ่ม mp4 ตัวอย่างลงในคำถาม ขอบคุณสำหรับความช่วยเหลือของคุณ!
Ryan

เพื่อความเป็นส่วนตัวฉันจะไม่อัปโหลด MOV ต้นทางจริง ฉันต้องการที่จะตัดมันและลบเสียง (เหมือนที่ฉันทำไว้กับ mp4) ดังนั้นมันจะไม่เป็นแหล่งต้นฉบับที่แท้จริงอยู่แล้ว ถึงแม้ว่ามันจะใหญ่เกินไปที่จะอัพโหลด และขั้นตอนการแบ่งฉากน่าจะเกิดขึ้นกับไฟล์ mp4 แทนที่จะเป็นไฟล์ MOV เพื่อใช้พื้นที่ดิสก์ต่อไป ขอบคุณ!
Ryan

3

นี่คือโบนัส: สคริปต์ PowerShell ที่ 3 นี้สร้างภาพขนาดย่อของโมเสก

คุณจะได้รับหนึ่งภาพต่อวิดีโอตอนที่ทุกคนมีลักษณะเหมือนตัวอย่างด้านล่าง

### Options __________________________________________________________________________________________________________
$ffmpeg = ".\ffmpeg.exe"       # Set path to your ffmpeg.exe; Build Version: git-45581ed (2014-02-16)
$folder = ".\Videos\*"         # Set path to your video folder; '\*' must be appended
$x = 5                         # Set how many images per x-axis
$y = 4                         # Set how many images per y-axis
$w = 384                       # Set thumbnail width in px (full image width: 384px x 5 = 1920px,)

### Main Program ______________________________________________________________________________________________________

foreach ($video in dir $folder -include "*_???.mp4" -r){

  ### get video length in frames, an ingenious method
  $log = & $ffmpeg -i $video -vcodec copy -an -f null $video 2>&1   
  $frames = $log | Select-String '(?<=frame=.*)\S+(?=.*fps=)' | % { $_.Matches } | % { $_.Value }  
  $frame = [Math]::floor($frames / ($x * $y))

  ### put together the correct new picture name
  $output = $video.directory.Fullname + "\" + $video.basename + ".jpg"

  ### use ffmpeg to create one mosaic png per video file
  ### Basic explanation for -vf options:  http://trac.ffmpeg.org/wiki/FilteringGuide
#1  & $ffmpeg -y -i $video -vf "select=not(mod(n\,`"$frame`")),scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output
#2  & $ffmpeg -y -i $video -vf "yadif,select=not(mod(n\,`"$frame`")),scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output 
    & $ffmpeg -y -i $video -vf "mpdecimate,yadif,select=not(mod(n\,`"$frame`")),scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output       

#4  & $ffmpeg -y -i $video -vf "select='gt(scene\,0.06)',scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 -vsync vfr $output  
#5  & $ffmpeg -y -i $video -vf "yadif,select='gt(scene\,0.06)',scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 -vsync vfr $output  
#6  & $ffmpeg -y -i $video -vf "mpdecimate,yadif,select='gt(scene\,0.06)',scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 -vsync vfr $output  

#7  & $ffmpeg -y -i $video -vf "thumbnail,scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output
#8  & $ffmpeg -y -i $video -vf "yadif,thumbnail,scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output
#9  & $ffmpeg -y -i $video -vf "mpdecimate,yadif,thumbnail,scale=`"$w`":-1,tile=`"$x`"x`"$y`"" -frames:v 1 $output
}

แนวคิดหลักคือการรับสตรีมรูปภาพอย่างต่อเนื่องผ่านวิดีโอทั้งหมด เราทำสิ่งนี้กับตัวเลือกการเลือกของ ffmpeg

อันดับแรกเราดึงข้อมูลการนับเฟรมทั้งหมดด้วยวิธีที่ชาญฉลาด (เช่น 2000) และหารด้วยการนับภาพขนาดย่อเริ่มต้นของเรา (เช่น 5 x 4 = 20) ดังนั้นเราจึงต้องการสร้างหนึ่งภาพทุกๆ 100 เฟรมตั้งแต่2000 / 20 = 100

คำสั่งผลลัพธ์ ffmpeg เพื่อสร้างรูปขนาดย่ออาจมีลักษณะ

ffmpeg -y -i input.mp4 -vf "mpdecimate,yadif,select=not(mod(n\,100)),scale=384:-1,tile=5x4" -frames:v 1 output.png

ในรหัสข้างต้นคุณจะเห็น-vfชุดค่าผสมที่แตกต่างกัน 9 ชุดประกอบด้วย

  • select=not(mod(n\,XXX)) โดยที่ XXX เป็นอัตราเฟรมที่คำนวณ
  • thumbnail ซึ่งจะเลือกเฟรมตัวแทนมากที่สุดโดยอัตโนมัติ
  • select='gt(scene\,XXX)+ -vsync vfrโดยที่ XXX เป็นเกณฑ์ที่คุณต้องเล่นด้วย
  • mpdecimate- ลบเฟรมที่ใกล้เคียงกันออก ดีสำหรับฉากสีดำ
  • yadif- ยกเลิกภาพอินพุต ไม่รู้ว่าทำไม แต่ใช้งานได้

เวอร์ชัน 3 เป็นตัวเลือกที่ดีที่สุดในความคิดของฉัน คนอื่น ๆ ทั้งหมดได้รับการแสดงความคิดเห็น แต่คุณยังสามารถลองได้ ผมสามารถที่จะลบมากที่สุดของภาพขนาดย่อตาพร่าใช้mpdecimate, และyadif select=not(mod(n\,XXX))ใช่

สำหรับวิดีโอตัวอย่างของคุณฉันจะได้รับตัวอย่างเหล่านี้

ป้อนคำอธิบายรูปภาพที่นี่
คลิกเพื่อดูภาพขยาย

ป้อนคำอธิบายรูปภาพที่นี่
คลิกเพื่อดูภาพขยาย

ฉันอัพโหลดรูปขนาดย่อทั้งหมดที่สร้างโดยเวอร์ชันเหล่านั้น ลองดูที่การเปรียบเทียบแบบเต็ม


เจ๋งมาก! ฉันจะดูที่นี้ ฉันเสียเวลาหลายชั่วโมงในวันนี้เพื่อพยายามselect='gt(scene\,0.4)'ทำงาน และฉันก็ไม่fps="fps=1/600"สามารถทำงานได้เช่นกัน คุณมีความคิดเกี่ยวกับsuperuser.com/questions/725734หรือไม่? ขอบคุณมากสำหรับความช่วยเหลือของคุณ ฉันตื่นเต้นสุด ๆ ที่ช่วยให้ครอบครัวของฉันค้นพบความทรงจำเก่า ๆ มากมาย
Ryan

คุณลองชุดการเข้ารหัส 5 ตัวที่ฉันอยู่ด้านล่างหรือไม่? ฉันเพิ่มตัวอย่างการทำงานสำหรับตัวเลือก "ฉาก" ลืมเกี่ยวกับตัวกรอง FPS ฉันจัดการเพื่อลบมากที่สุดของนิ้วหัวแม่มือตาพร่า :)
nixda

0

ชื่นชมทั้งสองสคริปต์วิธีที่ดีในการแยกวิดีโอ

ถึงกระนั้นฉันมีปัญหาบางอย่างกับวิดีโอที่ไม่แสดงเวลาที่ถูกต้องหลังจากนั้นและฉันไม่สามารถข้ามไปยังเวลาที่กำหนดได้ ทางออกหนึ่งคือ demux แล้วจึงทำการสตรีมโดยใช้ Mp4Box

อีกวิธีที่ง่ายกว่าสำหรับฉันคือใช้ mkvmerge เพื่อแยก ดังนั้นสคริปต์ทั้งสองจึงต้องมีการเปลี่ยนแปลง สำหรับ detect_black.ps1 จะต้องเพิ่มเฉพาะ "* .mkv" ในตัวเลือกตัวกรอง แต่ไม่จำเป็นว่าถ้าคุณเริ่มต้นด้วยไฟล์ mp4 เท่านั้น

### Options        
$mkvmerge = ".\mkvmerge.exe"        # Set path to mkvmerge.exe
$folder = ".\*"                     # Set path to your video folder; '\*' must be appended
$filter = @("*.mov", "*.mp4", "*.mkv")        # Set which file extensions should be processed

### Main Program 
foreach ($video in dir $folder -include $filter -exclude "*_???.*" -r){

  ### Set path to logfile
  $logfile = "$($video.FullName)_ffmpeg.log"

  ### Read in all cutpoints from *_cutpoints.csv; concat to string e.g "00:03:23.014,00:06:32.289,..."  
  $cuts = ( Import-Csv "$($video.FullName)_cutpoints.csv" | % {$_.cut} ) -join ","

  ### put together the correct new name, "%03d" is a generic number placeholder for mkvmerge
  $output = $video.directory.Fullname + "\" + $video.basename + "-%03d" + ".mkv"

  ### use mkvmerge to split current video in parts according to their cut points and convert to mkv
  & $mkvmerge -o $output --split timecodes:$cuts $video
}

ฟังก์ชั่นเหมือนกัน แต่ไม่มีปัญหากับวิดีโอเท่าที่ผ่านมา ขอบคุณสำหรับแรงบันดาลใจ


-2

ฉันหวังว่าฉันผิด แต่ฉันไม่คิดว่าสิ่งที่คุณขอเป็นไปได้ อาจเป็นไปได้ในขณะที่เข้ารหัสวิดีโออีกครั้ง แต่เป็น "ชิ้นส่วนสูญเสียแบบง่าย" ฉันไม่ทราบวิธีใด ๆ

โปรแกรมแก้ไขวิดีโอส่วนใหญ่จะมีคุณสมบัติการวิเคราะห์อัตโนมัติหรือสิ่งที่เทียบเท่าซึ่งอาจสามารถแยกวิดีโอของคุณในกรอบสีดำได้ แต่ต้องใช้การเข้ารหัสวิดีโออีกครั้ง

โชคดี!


เป็นไปได้อย่างแน่นอน คุณสามารถเชือดวิดีโอในแบบที่ไม่สูญเสียโดยไม่มีปัญหา (เช่นกับเซ็กเมนต์ muxer ใน ffmpegดูวิกิ ffmpeg บนวิดีโอการตัด ) โปรแกรมตัดต่อวิดีโอใด ๆ ที่ดีควรจะทำ ปัญหาเดียวที่ตรวจจับการเปลี่ยนแปลงของฉาก
slhck

1
จริงๆแล้วคุณทำไม่ได้ ปัญหาที่ใหญ่ที่สุดอาจเป็นคีย์เฟรม คลิปทั้งหมดต้องเริ่มต้นด้วยคีย์เฟรมเพื่อให้สามารถแสดงผลอย่างถูกต้องในการเล่นแม้ในเครื่องมือแก้ไข หากเฟรมสีดำไม่ได้ขึ้นต้นด้วยคีย์เฟรมจะมีความเข้ากันไม่ได้ในขณะที่ใช้การตัดแบบไม่มีการสูญเสีย
JasonXA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.