แบ่งไฟล์วิดีโอ. 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.