ฉันมีมากมาก มาก สคริปต์น่าเกลียดในการรวมไฟล์หลายไฟล์ของเกมฟุตบอลของฉัน (ฉันมีกล้อง 10 ตัวต่อเกม) และตอนนี้ฉันเริ่มสร้างไฮไลท์ของแต่ละเกม แต่กล้องบางตัวมีอัตราเฟรมที่แตกต่างกันและใช้ตัวแปลงสัญญาณที่แตกต่างกัน ดังนั้นตอนนี้ฉันสูญเสียอย่างสิ้นเชิงเกี่ยวกับวิธีทำให้สิ่งเหล่านี้ทำงานใน linux ฉันโอเคกับ GUI หรือซอฟต์แวร์ตัดต่อวิดีโออื่นๆ ถ้านั่นคือสิ่งที่ควรทำ
สคริปต์น่าเกลียด (สำหรับบริบท)
#!/bin/bash
#filesList=""
#for ไฟล์ใน $(ls -1v *.MP4);do #lists ไฟล์ที่มีเลขคู่
# filesList="${filesList}${file}|"
#เสร็จแล้ว
#filesList=${filesList%?} # ลบไปป์ต่อท้าย
#ffmpeg -i "concat:$filesList" -c copy ../$(วันที่ +%Y%m%d_%H%M%S)_merged.mp4
#ปรับแต่งด้วยตัวคุณเอง
SimpleCopy(){
printf "คุณต้องการภาพขนาดย่อ:\n"
เลือกคำตอบใน Yes No Mkv
ทำ
หยุดพัก;
เสร็จแล้ว
}
ตรวจสอบโฟลเดอร์ (){
d=$(zenity --file-selection --title="เลือกไดเร็กทอรีและรวมไฟล์ .MP4 ทั้งหมดภายในโฟลเดอร์" --directory)
}
SimpleCopy
ตรวจสอบโฟลเดอร์
ซีดี "$d"
เสียงสะท้อน $(pwd)
howManyFolders=$(ls -l -tr "$(pwd)" | grep -c ^d)
ถ้า [ $howManyFolders -gt 1 ]
แล้ว
ตรวจสอบโฟลเดอร์
ไฟ
currentDate=$(วันที่ +'%m.%d.%Y_%H.%M')
safeVideoName="${d/ /_}"
safeVideoName="${safeVideoName////}"
echo "safeVideoName: ${safeVideoName}"
videoName="../${safeVideoName}_${currentDate}_merged"
ถ้า [ "$answer" = "ใช่" ]
แล้ว
จำนวนวิดีโอ = 0
ตัวกรองวิดีโอ=""
รายการไฟล์ = ""
สำหรับไฟล์ใน $(ls -1v | grep -i mp4);do
filesList="${filesList} -i ${file}"
videoFilter="${videoFilter}[${numberOfVideos}:v][${numberOfVideos}:a]"
ให้ "numberOfVideos=numberOfVideos+1"
เสร็จแล้ว
echo "ตัวกรองวิดีโอ: ${videoFilter}"
ffmpeg $filesList -vf "transpose=2,transpose=2,transpose=2" -filter_complex "${videoFilter}concat=n=${numberOfVideos}:v=1:a=1[vv][a];[vv ]overlay=main_w-overlay_w-5:main_h-overlay_h-5[v]:" -map "[v]" -map "[a]" ${videoName%/}.mp4
elif [ "$answer" = "Mkv" ]
แล้ว
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.MP4' -printf "file '$PWD/%p'\n" | sort) -c copy ${videoName%/} เอ็มเควี
อื่น
ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; พิมพ์ "ไฟล์ '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copy "${videoName%/}.mp4"
ไฟ
เมื่อฉันรวมไฟล์ ไฟล์ H.265 จะเล่นได้ดี แต่เมื่อเป็น MP4 จะมีเพียงเฟรมสุดท้ายจากไฟล์ H.265 และเสียงจาก MP4
พบข้อผิดพลาดเมื่อผสาน
// cmd - echo ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; พิมพ์ "ไฟล์ '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copy "${videoName%/}.mp4"
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f528e4d3c0] การแทรกตัวกรองบิตสตรีม h264_mp4toannexb อัตโนมัติ
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655360 ปัจจุบัน: 626560; เปลี่ยนเป็น 655361 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[concat @ 0x55f528e436c0] DTS 1116270 < 1167534 ใช้งานไม่ได้
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:0; ก่อนหน้า: 1226574 ปัจจุบัน: 1175310; เปลี่ยนเป็น 1226575 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655361 ปัจจุบัน: 627584; เปลี่ยนเป็น 655362 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:0; ก่อนหน้า: 1226575 ปัจจุบัน: 1178313; เปลี่ยนเป็น 1226576 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
[mp4 @ 0x55f528e4fb40] DTS ที่ไม่จำเจในเอาต์พุตสตรีม 0:1; ก่อนหน้า: 655362 ปัจจุบัน: 628608; เปลี่ยนเป็น 655363 ซึ่งอาจทำให้การประทับเวลาไม่ถูกต้องในไฟล์เอาต์พุต
ฉันสามารถให้ตัวอย่างคลิปถ้าจำเป็น :)