Échantillonnage différent = décalage audio

Started by Dagobert_78, May 01, 2024, 12:32:08 PM

Previous topic - Next topic

Dagobert_78

Bonjour les enfants.

AVIdeMux v2.8.2 build 24.03.16
Windows 10 x64
Encodage vidéo : x264, 2 passes, MKV
Encodage audio : oui et non (COPY)

Je concatène des vidéos provenant de différentes sources.
Je retire quelques morceaux par-ci par là, puis je réencode (pas en COPY car je coupe en dehors des « images clés »).
message d'erreur car 1 vidéo source sur 10 à une résolution non identique (2160x1080), pas de soucis, je mets les 2-3 vidéo à la même résolution que la majorité (1920x1080)

L'encodage se passe bien, aucun message d'erreur.

La vidéo résultante pose problème, car un décalage du son est présent.

Aucun message d'erreur, mais le problème semble venir de 2 échantillonnages audio différents dans les vidéos sources, 44,1 et 48 kHz.

Qu'à cela ne tienne, j'active un filtre audio, et j'active le re-échantillonnage à 44'100 Hz.
Toujours un décalage.

Si j'active le re-échantillonnage à 48'000 Hz.
Toujours un décalage.

Peut importe l'encodage audio : COPY, mp3 et AC3, avec ou sans re-échantillonnage en 48 ou 44,1 kHz
J'ai toujours un décalage audio.

Je suis donc obligé de re-échantillonner 50 % de mes vidéos sources à 44,1 kHz, avant de les concaténer/encoder.



1. Est-ce normal de ne pas avoir de message d'alerte en cas d'échantillonnages différents sur les vidéos importées, comme celui en cas de résolutions différentes ?

2. Comment peut-on éviter le décalage audio sans ré-échantillonner les vidéos sources avant de les concaténer ?

Dagobert_78

En attendant une solution qui m'éviterais un post-traitement, et en me servant du Script de Simonalain21, je me suis fait un scrip afin de convertir tous les audios au bon échantillonnage.

Mais je dois toujours, manuellement, rechercher les vidéos qui n'ont pas le bon échantillonnage.

#PY  <- Needed to identify #
adm = Avidemux()
gui = Gui()
# --------  extension recherchée  --------
ext = "mkv"
# ----------------
sep = "\\"

def processVideo(vidin, outdir):
    if not adm.loadVideo(vidin):
        return 0

# -------- Audio Config  AC3 stéréo +3 db--------       
    adm.audioClearTracks()
    if adm.audioTotalTracksCount() <= 0:
        return 0
    adm.audioAddTrack(0)
    adm.audioCodec(0, "LavAC3", "bitrate=640")
    adm.audioSetResample(0, 48000)
    adm.audioSetDrc2(0, 0, 1, 0.001, 0.2, 1, 2, -12)
    adm.audioSetEq(0, 0, 0, 0, 0, 880, 5000)
    adm.audioSetChannelGains(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    adm.audioSetChannelDelays(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    adm.audioSetChannelRemap(0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8)
    adm.audioSetShift(0, 0, 0)

# -------- Video Config --------
# --------   COPY  --------
    adm.videoCodec("Copy")
# --------  --------
    adm.setContainer("MKV", "forceAspectRatio=False", "displayWidth=1280", "displayAspectRatio=2", "addColourInfo=False", "colMatrixCoeff=2", "colRange=0", "colTransfer=2", "colPrimaries=2")
    return adm.save(outdir + sep + basename(vidin))

# --------  Choix du dossier source  --------
inputFolder = gui.dirSelect("Select source folder")
if inputFolder is None:
    gui.displayError("Error", "No source folder selected")
    return 0

# -------- read content --------
vidlist = get_folder_content(inputFolder, ext)
if vidlist is None:
    gui.displayError("Error", "No " + ext + " files found in \"" + inputFolder + "\"")
    return 0

# --------  Choix de la destination  --------
outputFolder = gui.dirSelect("Select output folder")
if outputFolder is None:
    gui.displayError("Error", "No output folder selected")
    return 0

if(inputFolder == outputFolder):
    gui.displayError("Error","Output folder cannot be the same as the input one")
    return 0

success = 0

for video in vidlist:
    success += processVideo(video, outputFolder)

if not success:
    gui.displayInfo("Warning", "No video files processed")
elif success == 1:
    gui.displayInfo("Finished", "One video out of " + str(len(vidlist)) + " processed")
else:
    gui.displayInfo("Finished", str(success) + " videos out of " + str(len(vidlist)) + " processed")

return success