Question Extraction de métadonées de fichiers vidéos

Plus d'informations
il y a 1 mois 1 semaine #34580 par cedric
Salut à tous, je suis tout aussi débutant sur le forum qu'en scripts, merci de m'accueillir . 

Fichier attaché :

Nom du fichier : meta_films2.ps1
Taille du ficher :1 ko
 

Fichier attaché :

Nom du fichier : meta_films2.ps1
Taille du ficher :1 ko

Je jette une bouteille à la mer 

Voilà mon projet, j'ai un NAS avec des vidéos, je souhaite créer un script qui récupère le nom et la durée de chaque fichier mp4, j'ai fait un script qui fonctionne qu'a moitié, je liste les noms mais pas la durée.

Là c'est la version avec FFMPEG qui m'a gentiment conseillé un Chatbot mais toujours pas d'information de temps.

Si quelqu'un à une piste, je suis preneur.

Mon script:


# Changer de répertoire vers le dossier réseau contenant les fichiers vidéo
Set-Location "\\MMServer\videos"

# Chemin vers ffmpeg
$ffmpegPath = "C:\ffmpeg\bin\ffmpeg.exe"

# Créer un fichier de sortie
$outputFile = "duree_videos_completes.txt"

# Supprimer le fichier de sortie s'il existe déjà
if (Test-Path $outputFile) {
    Remove-Item $outputFile
}

# Obtenir les durées de chaque fichier .mp4
Get-ChildItem -Filter *.mp4 | ForEach-Object {
    $file = $_

    # Utiliser ffmpeg pour obtenir les informations de durée
    $ffmpegOutput = & $ffmpegPath -i $file.FullName -hide_banner 2>&1 | Out-String

    # Initialiser les valeurs
    $duration = "Inconnue"
    $playTime = "Inconnu"
    $trackTime = "Inconnu"

    # Rechercher les différentes durées
    if ($ffmpegOutput -match "Duration:\s+(\d+:\d+:\d+\.\d+)") {
        $duration = $matches[1]
    }
    if ($ffmpegOutput -match "Play time:\s+(\d+:\d+:\d+\.\d+)") {
        $playTime = $matches[1]
    }
    if ($ffmpegOutput -match "Track time:\s+(\d+:\d+:\d+\.\d+)") {
        $trackTime = $matches[1]
    }

    # Créer un objet avec le nom et les durées
    $props = [ordered]@{
        'Nom'        = $file.Name
        'Duration'   = $duration
        'Play Time'  = $playTime
        'Track Time' = $trackTime
    }

    New-Object PSObject -Property $props
} | Format-Table | Out-File $outputFile

Write-Host "Nom, Duration, Play Time et Track Time extraits dans $outputFile"
__________________________________________________________________________________________________________________________
 Résultat: "duree_videos_completes.txt"


Nom                                                                    Durée   
---                                        
  
Boneyard.2024.mp4                                        Inconnue
Cabrini.2024.mp4                                            Inconnue
Captives.2024.mp4                                         Inconnue
Et.Plus.Si.Affinites.2024.mp4                          Inconnue
 
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 semaine #34581 par Francois Dunoyer
J'ai testé et pour moi ça marche.
bon j'ai fait qq petits modifs car je ne voulais pas de fichier mais c'est totalement la meme Idee



<#
.SYNOPSIS
Recherche info sur les fichiers Video
.DESCRIPTION
Voilà mon projet, j'ai un NAS avec des vidéos, je souhaite créer un script qui récupère le nom et la durée de chaque fichier mp4, j'ai fait un script qui fonctionne qu'a moitié, je liste les noms mais pas la durée.
Là c'est la version avec FFMPEG qui m'a gentiment conseillé un Chatbot mais toujours pas d'information de temps.

.NOTES
www.powershell-scripting.com/index.php/f...rs-vid%C3%A9os#34580
Pour trouver ffmpeg -> ffmpeg.org/
A installer aussi via winget : winget install ffmpeg

.PARAMETER Dossier
Dossier à explorer style "\\MMServeur\Films"
.PARAMETER ffmpegPath
Chemin vers ffmpeg style "C:\ffmpeg\bin\ffmpeg.exe"
#>
[CmdletBinding()]
param (
[Parameter()][String]$Dossier="y:\Video\Films\",
[Parameter()][String]$ffmpegPath = "c:\Tools\ffmpeg\bin\ffmpeg.exe"
)

# Changer de répertoire vers le dossier réseau contenant les fichiers vidéo
Set-Location $Dossier


# Créer un fichier de sortie
$outputFile = "duree_videos_completes.txt"

# Supprimer le fichier de sortie s'il existe déjà
if (Test-Path -path $outputFile) { Remove-Item $outputFile }

# Obtenir les durées de chaque fichier .mp4
$Res=@()
$Liste=Get-ChildItem -Filter *.mp4
ForEach ($File in $Liste) {

# Utiliser ffmpeg pour obtenir les informations de durée
$ffmpegOutput = & $ffmpegPath -i $file.FullName -hide_banner 2>&1| Out-String

# Initialiser les valeurs
$duration = "Inconnue"
$playTime = "Inconnu"
$trackTime = "Inconnu"

# Rechercher les différentes durées
if ($ffmpegOutput -match "Duration:\s+(\d+:\d+:\d+\.\d+)") {
$duration = $matches[1]
$Message='La durée du film est de {0}' -f $Duration
}
if ($ffmpegOutput -match "Play time:\s+(\d+:\d+:\d+\.\d+)") {
$playTime = $matches[1]
}
if ($ffmpegOutput -match "Track time:\s+(\d+:\d+:\d+\.\d+)") {
$trackTime = $matches[1]
}

# Créer un objet avec le nom et les durées
$props = [ordered]@{
'Nom' = $file.Name
'Duree' = $duration
'Play Time' = $playTime
'Track Time' = $trackTime
}

$res+=New-Object PSObject -Property $props
}
$res | Format-Table Nom,Duree

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 4 jours #34593 par cedric
Merci pour ton aide, c'était des problèmes de droit d'accès à mon NAS.
Après j'ai eu d'autre galères, ça ma soulé, j'ai fini par tout faire en VBA sous excel.
Bon week-end

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.121 secondes
Propulsé par Kunena