Am o foarte foarte foarte script urat pentru a îmbina mai multe fișiere ale jocurilor mele de fotbal (am 10 camere pe joc) și acum încep să fac momentele importante ale fiecărui joc. Dar unele dintre camere au rate de cadre diferite și folosesc codecuri diferite. Așa că acum sunt complet în pierdere în ceea ce privește cum să le fac să funcționeze în Linux. Aș fi de acord cu o interfață grafică sau un alt software de editare video dacă asta ar fi nevoie.
Script urat (pentru context)
#!/bin/bash
#filesList=""
#pentru fișierul în $(ls -1v *.MP4);do #listează fișierele cu numere par
# filesList="${filesList}${file}|"
#Terminat
#filesList=${filesList%?} # elimină conducta finală
#ffmpeg -i "concat:$filesList" -c copie ../$(data +%Y%m%d_%H%M%S)_merged.mp4
# personalizați cu propria dvs.
simpleCopy(){
printf „Doriți să aveți o miniatură:\n”
selectați răspunsul în Da Nu Mkv
do
pauză;
Terminat
}
checkFolders(){
d=$(zenity --file-selection --title="Alegeți un director și îmbinați toate fișierele .MP4 din dosar" --director)
}
simpleCopy
checkFolders
cd „$d”
echo $(pwd)
howManyFolders=$(ls -l -tr „$(pwd)” | grep -c ^d)
dacă [ $howManyFolders -gt 1 ]
atunci
checkFolders
fi
currentDate=$(data +'%m.%d.%Y_%H.%M')
safeVideoName="${d/ /_}"
safeVideoName="${safeVideoName////}"
echo „safeVideoName: ${safeVideoName}”
videoName="../${safeVideoName}_${currentDate}_merged"
dacă [ "$răspuns" = "Da" ]
atunci
numberOfVideos=0
videoFilter=""
filesList=""
pentru fișierul în $(ls -1v | grep -i mp4);do
filesList="${filesList} -i ${file}"
videoFilter="${videoFilter}[${numberOfVideos}:v][${numberOfVideos}:a]"
lasă „numberOfVideos=numberOfVideos+1”
Terminat
echo „videoFilter: ${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]:" -hartă „[v]” -hartă „[a]” ${videoName%/}.mp4
elif [ "$răspuns" = "Mkv" ]
atunci
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.MP4' -printf "fișier '$PWD/%p'\n" | sort) -c copy ${videoName%/}. mkv
altfel
ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; tipăriți „fișierul '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copie „${videoName%/}.mp4”
fi
Când îmbin fișierele, fișierele H.265 sunt redate bine, dar când ajunge la MP4, are doar ultimul cadru din fișierele H.265 și audio din MP4.
eroare observată la îmbinare
// cmd - echo ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; tipăriți „fișierul '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c copie „${videoName%/}.mp4”
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f528e4d3c0] Se inserează automat filtrul de flux de biți h264_mp4toannexb
[mp4 @ 0x55f528e4fb40] DTS nemonoton în fluxul de ieșire 0:1; anterior: 655360, actual: 626560; schimbarea la 655361. Acest lucru poate duce la marcaje temporale incorecte în fișierul de ieșire.
[concat @ 0x55f528e436c0] DTS 1116270 < 1167534 defect
[mp4 @ 0x55f528e4fb40] DTS nemonoton în fluxul de ieșire 0:0; anterior: 1226574, actual: 1175310; se schimbă la 1226575. Acest lucru poate duce la marcaje temporale incorecte în fișierul de ieșire.
[mp4 @ 0x55f528e4fb40] DTS nemonoton în fluxul de ieșire 0:1; anterior: 655361, actual: 627584; se schimbă la 655362. Acest lucru poate duce la marcaje temporale incorecte în fișierul de ieșire.
[mp4 @ 0x55f528e4fb40] DTS nemonoton în fluxul de ieșire 0:0; anterior: 1226575, curent: 1178313; se schimbă la 1226576. Acest lucru poate duce la marcaje temporale incorecte în fișierul de ieșire.
[mp4 @ 0x55f528e4fb40] DTS nemonoton în fluxul de ieșire 0:1; anterior: 655362, actual: 628608; se schimbă la 655363. Acest lucru poate duce la marcaje temporale incorecte în fișierul de ieșire.
Pot oferi exemple de clipuri dacă este necesar :)