Puncte:2

Cum să îmbinați mai multe fișiere video cu codecuri diferite? MP4/H.265

drapel cn

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.

introduceți descrierea imaginii aici

Pot oferi exemple de clipuri dacă este necesar :)

raj avatar
drapel cn
raj
Scriptul dvs. folosește `ffmpeg` pentru a îmbina fișierele folosind doar pseudo-codec `copy`. Dacă fișierele sunt codificate diferit, trebuie să faceți codificarea reală cu `ffmpeg`, de exemplu.trebuie să furnizați un nume de codec de ieșire real în loc de `copy`. Apoi `ffmpeg` ar trebui să recodice toate clipurile în formatul pe care îl specificați. Poate fi necesar să adăugați câțiva parametri suplimentari care specifică detaliile de codare, deoarece `ffmpeg` este un software complicat pe care trebuie să-l experimentați și să testați ce opțiuni oferă cea mai bună rezultate.
raj avatar
drapel cn
raj
De asemenea, probabil că trebuie să furnizați un format de ieșire real în loc de `concat`.
drapel cn
Ah interesant. Deci ar dura mult mai mult, dar ar funcționa. Mă întreb dacă aș putea doar să recodificați fișierele care erau MP4 și nu 265? Bănuiesc că puteți face o verificare în `ffmpeg` pentru a verifica care este fișierul?
raj avatar
drapel cn
raj
Nu cred că `ffmpeg` are un parametru care să-i spună „dacă formatul este același, atunci nu recodificați”. Dacă nu îi spui să „copie”, atunci se recodează întotdeauna, chiar și din același format în același format. Deci, probabil, mai întâi trebuie să codificați clipurile H265 în MP4 (folosind și `ffmpeg`) și apoi să îmbinați toate fișierele MP4 folosind scriptul dvs. Dar trebuie să vă asigurați că le convertiți în MP4 cu exact aceiași parametri (codec, framerate, dimensiune etc.) ca și MP4-urile pe care le aveți deja.
raj avatar
drapel cn
raj
Dar probabil că îi poți spune explicit lui `ffmpeg` să `copie` fișierele care sunt deja MP4 și să recodifice celelalte. Dar mai întâi trebuie să identifici care sunt care. Puteți folosi `ffprobe` care vine cu `ffmpeg` pentru a identifica fișierele video.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.