Maison développement back-end Golang Golang et FFmpeg : Comment implémenter l'interception et la mise à l'échelle d'images vidéo

Golang et FFmpeg : Comment implémenter l'interception et la mise à l'échelle d'images vidéo

Sep 27, 2023 am 09:34 AM
视频 实现 golanggolang ffmpegffmpeg

Golang与FFmpeg: 如何实现视频帧截取和缩放

Golang et FFmpeg : Comment implémenter l'interception et la mise à l'échelle d'images vidéo, des exemples de code spécifiques sont nécessaires

Aperçu :
Avec l'augmentation des besoins en traitement vidéo, les gens sont de plus en plus enclins à utiliser Golang comme langage de programmation pour le traitement vidéo. En tant que framework de traitement multimédia open source le plus populaire du secteur, FFmpeg fournit des fonctions riches pour traiter les données audio et vidéo. Cet article expliquera comment utiliser Golang pour appeler FFmpeg afin d'implémenter les fonctions d'interception et de mise à l'échelle d'images vidéo, et fournira des exemples de code correspondants.

Prérequis :
Avant de commencer, vous devez vous assurer que FFmpeg est installé sur votre machine et que les variables d'environnement correctes sont configurées.

Interception d'images vidéo :
Tout d'abord, voyons comment mettre en œuvre l'interception d'images vidéo. Dans FFmpeg, vous pouvez utiliser le module « avformat » pour lire les fichiers vidéo et le module « avcodec » pour décoder les images vidéo. Voici un exemple de code simple :

package main

import (
    "fmt"
    "log"

    "github.com/giorgisio/goav/avcodec"
    "github.com/giorgisio/goav/avformat"
)

func main() {
    // 打开视频文件
    formatContext := avformat.AvformatAllocContext()
    if err := avformat.AvformatOpenInput(&formatContext, "/path/to/video.mp4", nil, nil); err != nil {
        log.Fatal("无法打开视频文件:", err)
    }
    defer avformat.AvformatFreeContext(formatContext)

    // 查找视频流
    if err := formatContext.AvformatFindStreamInfo(nil); err != nil {
        log.Fatal("无法查找视频流:", err)
    }

    var videoStreamIndex int32 = -1
    for i, stream := range formatContext.Streams() {
        if stream.CodecParameters().CodecType() == avformat.AVMEDIA_TYPE_VIDEO {
            videoStreamIndex = int32(i)
            break
        }
    }

    if videoStreamIndex == -1 {
        log.Fatal("找不到视频流")
    }

    // 找到视频解码器
    videoDecoder := avcodec.AvcodecFindDecoder(avcodec.CodecId(formatContext.Streams()[videoStreamIndex].CodecParameters().CodecId()))
    if videoDecoder == nil {
        log.Fatal("无法找到视频解码器")
    }

    // 打开解码器上下文
    videoCodecContext := avcodec.AvcodecAllocContext3(videoDecoder)
    if err := avcodec.AvcodecParametersToContext(videoCodecContext, formatContext.Streams()[videoStreamIndex].CodecParameters()); err != nil {
        log.Fatal("无法打开解码器上下文:", err)
    }

    if err := videoCodecContext.AvcodecOpen2(videoDecoder, nil); err != nil {
        log.Fatal("无法打开解码器:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecContext)

    // 读取视频帧
    packet := avcodec.AvPacketAlloc()
    defer avcodec.AvPacketFree(packet)

    for formatContext.AvReadFrame(packet) >= 0 {
        if packet.StreamIndex() == videoStreamIndex {
            frame := avutil.AvFrameAlloc()
            defer avutil.AvFrameFree(frame)

            if err := videoCodecContext.AvcodecSendPacket(packet); err == nil {
                for videoCodecContext.AvcodecReceiveFrame(frame) == nil {
                    // 处理视频帧
                    fmt.Printf("视频帧:%d
", frame.Pts())
                }
            }
        }
    }
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons d'abord avformat.AvformatAllocContext() pour allouer un objet de contexte de format, et utilisons avformat.AvformatOpenInput()</ code >Un fichier vidéo est ouvert. Ensuite, nous utilisons <code>avformat.AvformatFindStreamInfo() pour trouver le flux vidéo, puis utilisons avformat.AVMEDIA_TYPE_VIDEO pour déterminer s'il s'agit d'un flux vidéo. avformat.AvformatAllocContext()来分配一个格式上下文对象,并使用avformat.AvformatOpenInput()打开了一个视频文件。然后,我们使用avformat.AvformatFindStreamInfo()找到了视频流,再使用avformat.AVMEDIA_TYPE_VIDEO来判断是否为视频流。

接下来,我们使用avcodec.AvcodecFindDecoder()来查找适合的解码器,并使用avcodec.AvcodecParametersToContext()avcodec.AvcodecOpen2()打开了解码器上下文。

最后,我们使用formatContext.AvReadFrame()来读取视频帧,并在videoCodecContext.AvcodecReceiveFrame()中处理每一帧。在这个示例中,我们只是简单地打印每一帧的PTS值。

视频缩放:
接下来,我们来看一下如何实现视频帧的缩放。在FFmpeg中,可以使用"swscale"模块来进行视频帧的缩放。以下是一个简单的示例代码:

package main

import (
    "fmt"
    "image"
    "log"
    "os"

    "github.com/giorgisio/goav/avcodec"
    "github.com/giorgisio/goav/avformat"
    "github.com/giorgisio/goav/swscale"
    "github.com/nfnt/resize"
)

func main() {
    // 打开视频文件
    formatContext := avformat.AvformatAllocContext()
    if err := avformat.AvformatOpenInput(&formatContext, "/path/to/video.mp4", nil, nil); err != nil {
        log.Fatal("无法打开视频文件:", err)
    }
    defer avformat.AvformatFreeContext(formatContext)

    // 查找视频流
    if err := formatContext.AvformatFindStreamInfo(nil); err != nil {
        log.Fatal("无法查找视频流:", err)
    }

    var videoStreamIndex int32 = -1
    for i, stream := range formatContext.Streams() {
        if stream.CodecParameters().CodecType() == avformat.AVMEDIA_TYPE_VIDEO {
            videoStreamIndex = int32(i)
            break
        }
    }

    if videoStreamIndex == -1 {
        log.Fatal("找不到视频流")
    }

    // 找到视频解码器
    videoDecoder := avcodec.AvcodecFindDecoder(avcodec.CodecId(formatContext.Streams()[videoStreamIndex].CodecParameters().CodecId()))
    if videoDecoder == nil {
        log.Fatal("无法找到视频解码器")
    }

    // 打开解码器上下文
    videoCodecContext := avcodec.AvcodecAllocContext3(videoDecoder)
    if err := avcodec.AvcodecParametersToContext(videoCodecContext, formatContext.Streams()[videoStreamIndex].CodecParameters()); err != nil {
        log.Fatal("无法打开解码器上下文:", err)
    }

    if err := videoCodecContext.AvcodecOpen2(videoDecoder, nil); err != nil {
        log.Fatal("无法打开解码器:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecContext)

    // 创建视频缩放上下文
    swscaleContext := swscale.SwsGetContext(
        videoCodecContext.Width(), videoCodecContext.Height(), videoCodecContext.PixFmt(),
        videoCodecContext.Width()/2, videoCodecContext.Height()/2, avcodec.AV_PIX_FMT_RGB24,
        0, nil, nil, nil,
    )
    defer swscale.SwsFreeContext(swscaleContext)

    // 创建输出视频文件
    outfile, err := os.Create("/path/to/output.mp4")
    if err != nil {
        log.Fatal("无法创建输出视频文件:", err)
    }
    defer outfile.Close()

    // 创建视频编码器
    videoEncoder := avcodec.AvcodecFindEncoder(avcodec.AV_CODEC_ID_MPEG4)
    if videoEncoder == nil {
        log.Fatal("无法找到视频编码器")
    }

    // 创建编码器上下文
    videoCodecCtx := avcodec.AvcodecAllocContext3(videoEncoder)
    videoCodecCtx.SetBitRate(400000)
    videoCodecCtx.SetWidth(videoCodecContext.Width() / 2)
    videoCodecCtx.SetHeight(videoCodecContext.Height() / 2)
    videoCodecCtx.SetTimeBase(avformat.AVR{Num: 1, Den: 25})
    videoCodecCtx.SetPixFmt(avcodec.AV_PIX_FMT_YUV420P)

    // 打开编码器上下文
    if err := videoCodecCtx.AvcodecOpen2(videoEncoder, nil); err != nil {
        log.Fatal("无法打开编码器上下文:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecCtx)

    // 写入视频文件头
    formatContext.SetOutput(outfile)
    if err := formatContext.AvformatWriteHeader(nil); err != nil {
        log.Fatal("无法写入视频文件头:", err)
    }
    defer formatContext.AvformatFreeOutputContext()

    // 准备编码帧和缩放帧
    encodeFrame := avutil.AvFrameAlloc()
    defer avutil.AvFrameFree(encodeFrame)

    encodeFrame.SetWidth(videoCodecCtx.Width())
    encodeFrame.SetHeight(videoCodecCtx.Height())
    encodeFrame.SetFormat(int32(videoCodecCtx.PixFmt()))

    frameSize := avcodec.AvpixelAvImageGetBufferSize(avcodec.AV_PIX_FMT_RGB24, videoCodecCtx.Width()/2, videoCodecCtx.Height()/2, 1)
    encodeFrameBuffer := avutil.AvMalloc(frameSize)
    defer avutil.AvFree(encodeFrameBuffer)

    encodeFrame.AvpixelAvImageFillArrays(encodeFrameBuffer, 1)

    for formatContext.AvReadFrame(packet) >= 0 {
        if packet.StreamIndex() == videoStreamIndex {
            frame := avutil.AvFrameAlloc()
            defer avutil.AvFrameFree(frame)

            if err := videoCodecContext.AvcodecSendPacket(packet); err != nil {
                log.Fatal("无法发送视频包:", err)
            }

            for videoCodecContext.AvcodecReceiveFrame(frame) == nil {
                // 缩放视频帧
                swscale.SwsScale(
                    swscaleContext,
                    frame.Data(), frame.Linesize(),
                    0, frame.Height(),
                    encodeFrame.Data(), encodeFrame.Linesize(),
                )

                // 编码视频帧
                encodeFrame.SetPts(frame.Pts())
                packet := avcodec.AvPacketAlloc()
                if err := avcodec.AvcodecSendFrame(videoCodecCtx, encodeFrame); err != nil {
                    log.Fatal("无法发送编码帧:", err)
                }

                if err := avcodec.AvcodecReceivePacket(videoCodecCtx, packet); err != nil {
                    log.Fatal("无法接收编码包:", err)
                }
                defer avcodec.AvPacketFree(packet)

                // 写入编码后的帧到文件
                if err := formatContext.AvWriteFrame(packet); err != nil {
                    log.Fatal("无法写入帧到文件:", err)
                }
            }
        }
    }

    // 写入视频文件尾
    if err := formatContext.AvWriteTrailer(); err != nil {
        log.Fatal("无法写入视频文件尾:", err)
    }
}
Copier après la connexion

以上代码中,我们创建了一个视频缩放上下文swscaleContext,它的输入是原始视频帧的大小,输出是缩放后的视频帧的大小。我们还创建了一个新的编码器上下文videoCodecCtx,它的大小为原始视频帧大小的一半,并将其设置为YUV420P像素格式。

在读取到每一帧视频后,我们使用swscale.SwsScale()

Ensuite, nous utilisons avcodec.AvcodecFindDecoder() pour trouver un décodeur approprié, et utilisons avcodec.AvcodecParametersToContext() et avcodec.AvcodecOpen2() ouvre le contexte du décodeur. <p><br>Enfin, nous utilisons <code>formatContext.AvReadFrame() pour lire les images vidéo et traiter chaque image dans videoCodecContext.AvcodecReceiveFrame(). Dans cet exemple, nous imprimons simplement la valeur PTS pour chaque image.

🎜Mise à l'échelle vidéo : 🎜Ensuite, voyons comment réaliser la mise à l'échelle de l'image vidéo. Dans FFmpeg, vous pouvez utiliser le module « swscale » pour mettre à l'échelle les images vidéo. Voici un exemple de code simple : 🎜rrreee🎜Dans le code ci-dessus, nous créons un contexte de mise à l'échelle vidéo swscaleContext, dont l'entrée est la taille de l'image vidéo d'origine et la sortie est la taille de la image vidéo mise à l'échelle. Nous créons également un nouveau contexte d'encodeur videoCodecCtx qui fait la moitié de la taille de l'image vidéo d'origine et le définissons au format de pixel YUV420P. 🎜🎜Après avoir lu chaque image vidéo, nous utilisons la fonction swscale.SwsScale() pour la redimensionner à la taille spécifiée et envoyer l'image vidéo mise à l'échelle à l'encodeur pour l'encodage. Nous écrivons ensuite les images codées dans le fichier vidéo de sortie. 🎜🎜Résumé : 🎜La combinaison de Golang et FFmpeg offre aux développeurs un puissant outil de traitement vidéo. Dans cet article, nous expliquons comment utiliser Golang pour appeler FFmpeg afin d'implémenter les fonctions d'interception et de mise à l'échelle d'images vidéo, et fournissons des exemples de code correspondants. Espérons que ces exemples vous aideront à mieux comprendre comment utiliser Golang et FFmpeg pour traiter les données vidéo. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Est-ce une infraction de publier des vidéos d'autres personnes sur Douyin ? Comment éditer des vidéos sans infraction ? Est-ce une infraction de publier des vidéos d'autres personnes sur Douyin ? Comment éditer des vidéos sans infraction ? Mar 21, 2024 pm 05:57 PM

Avec l'essor des plateformes de vidéos courtes, Douyin est devenu un élément indispensable de la vie quotidienne de chacun. Sur TikTok, nous pouvons voir des vidéos intéressantes du monde entier. Certaines personnes aiment publier les vidéos d’autres personnes, ce qui soulève une question : Douyin enfreint-il la publication de vidéos d’autres personnes ? Cet article abordera ce problème et vous expliquera comment éditer des vidéos sans infraction et comment éviter les problèmes d'infraction. 1. Cela porte-t-il atteinte à la publication par Douyin de vidéos d'autres personnes ? Selon les dispositions de la loi sur le droit d'auteur de mon pays, l'utilisation non autorisée des œuvres du titulaire du droit d'auteur sans l'autorisation du titulaire du droit d'auteur constitue une infraction. Par conséquent, publier des vidéos d’autres personnes sur Douyin sans l’autorisation de l’auteur original ou du titulaire des droits d’auteur constitue une infraction. 2. Comment monter une vidéo sans contrefaçon ? 1. Utilisation de contenu du domaine public ou sous licence : Public

Comment gagner de l'argent en publiant des vidéos sur Douyin ? Comment un débutant peut-il gagner de l'argent sur Douyin ? Comment gagner de l'argent en publiant des vidéos sur Douyin ? Comment un débutant peut-il gagner de l'argent sur Douyin ? Mar 21, 2024 pm 08:17 PM

Douyin, la plateforme nationale de courtes vidéos, nous permet non seulement de profiter d'une variété de courtes vidéos intéressantes et originales pendant notre temps libre, mais nous donne également une scène pour nous montrer et réaliser nos valeurs. Alors, comment gagner de l’argent en postant des vidéos sur Douyin ? Cet article répondra à cette question en détail et vous aidera à gagner plus d’argent sur TikTok. 1. Comment gagner de l’argent en publiant des vidéos sur Douyin ? Après avoir posté une vidéo et obtenu un certain nombre de vues sur Douyin, vous aurez la possibilité de participer au plan de partage publicitaire. Cette méthode de revenus est l’une des plus connues des utilisateurs de Douyin et constitue également la principale source de revenus pour de nombreux créateurs. Douyin décide d'offrir ou non des opportunités de partage de publicités en fonction de divers facteurs tels que le poids du compte, le contenu vidéo et les commentaires du public. La plateforme TikTok permet aux téléspectateurs de soutenir leurs créateurs préférés en envoyant des cadeaux,

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Mar 24, 2024 am 11:27 AM

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Avec l’essor des réseaux sociaux, WeChat est devenu l’un des outils de communication indispensables dans la vie quotidienne des gens. Cependant, de nombreuses personnes peuvent rencontrer un problème : se connecter à plusieurs comptes WeChat en même temps sur le même téléphone mobile. Pour les utilisateurs de téléphones mobiles Huawei, il n'est pas difficile d'obtenir une double connexion WeChat. Cet article explique comment obtenir une double connexion WeChat sur les téléphones mobiles Huawei. Tout d'abord, le système EMUI fourni avec les téléphones mobiles Huawei offre une fonction très pratique : l'ouverture d'une double application. Grâce à la fonction de double ouverture de l'application, les utilisateurs peuvent simultanément

Comment publier des vidéos sur Weibo sans compresser la qualité de l'image_Comment publier des vidéos sur Weibo sans compresser la qualité de l'image Comment publier des vidéos sur Weibo sans compresser la qualité de l'image_Comment publier des vidéos sur Weibo sans compresser la qualité de l'image Mar 30, 2024 pm 12:26 PM

1. Ouvrez d'abord Weibo sur votre téléphone mobile et cliquez sur [Moi] dans le coin inférieur droit (comme indiqué sur l'image). 2. Cliquez ensuite sur [Gear] dans le coin supérieur droit pour ouvrir les paramètres (comme indiqué sur l'image). 3. Ensuite, recherchez et ouvrez [Paramètres généraux] (comme indiqué sur l'image). 4. Entrez ensuite l'option [Video Follow] (comme indiqué sur l'image). 5. Ensuite, ouvrez le paramètre [Résolution de téléchargement vidéo] (comme indiqué sur l'image). 6. Enfin, sélectionnez [Qualité d'image originale] pour éviter la compression (comme indiqué sur l'image).

Comment publier les œuvres vidéo de Xiaohongshu ? À quoi dois-je faire attention lorsque je publie des vidéos ? Comment publier les œuvres vidéo de Xiaohongshu ? À quoi dois-je faire attention lorsque je publie des vidéos ? Mar 23, 2024 pm 08:50 PM

Avec l'essor des plateformes de vidéos courtes, Xiaohongshu est devenue une plateforme permettant à de nombreuses personnes de partager leur vie, de s'exprimer et de gagner du trafic. Sur cette plateforme, la publication d’œuvres vidéo est un moyen d’interaction très prisé. Alors, comment publier les œuvres vidéo de Xiaohongshu ? 1. Comment publier les œuvres vidéo de Xiaohongshu ? Tout d’abord, assurez-vous d’avoir un contenu vidéo prêt à partager. Vous pouvez utiliser votre téléphone portable ou un autre équipement photo pour prendre des photos, mais vous devez faire attention à la qualité de l'image et à la clarté du son. 2. Editer la vidéo : Afin de rendre le travail plus attrayant, vous pouvez éditer la vidéo. Vous pouvez utiliser un logiciel de montage vidéo professionnel, tel que Douyin, Kuaishou, etc., pour ajouter des filtres, de la musique, des sous-titres et d'autres éléments. 3. Choisissez une couverture : La couverture est la clé pour inciter les utilisateurs à cliquer. Choisissez une image claire et intéressante comme couverture pour inciter les utilisateurs à cliquer dessus.

Comment intégrer une vidéo ppt dans un document diapositive et la combiner dans un fichier Comment intégrer une vidéo ppt dans un document diapositive et la combiner dans un fichier Mar 20, 2024 am 11:30 AM

La présentation Microsoft PowerPoint est l'un de nos logiciels bureautiques couramment utilisés. Afin de présenter le contenu à expliquer de manière complète et détaillée, la vidéo est l'une des méthodes de présentation importantes. Vous savez, lorsque nous insérons des vidéos dans PPT, que ce soit via des hyperliens ou des contrôles WindowsMediaPlayer, nous devons prendre en compte les problèmes de chemin. Donc, si nous voulons intégrer une vidéo PPT et la combiner dans un fichier, comment devons-nous le résoudre ? Voyons ensuite la solution ! Les étapes sont les suivantes : 1. Tout d'abord, nous double-cliquons pour ouvrir la présentation Microsoft PowerPoint [Video Embed.pptx]. Grâce à l'utilisation de ShockwaveFlashO

Comment implémenter la fonction de clonage WeChat sur les téléphones mobiles Huawei Comment implémenter la fonction de clonage WeChat sur les téléphones mobiles Huawei Mar 24, 2024 pm 06:03 PM

Comment mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei Avec la popularité des logiciels sociaux et l'importance croissante accordée à la confidentialité et à la sécurité, la fonction de clonage WeChat est progressivement devenue le centre d'attention. La fonction de clonage WeChat peut aider les utilisateurs à se connecter simultanément à plusieurs comptes WeChat sur le même téléphone mobile, ce qui facilite la gestion et l'utilisation. Il n'est pas difficile de mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei. Il vous suffit de suivre les étapes suivantes. Étape 1 : Assurez-vous que la version du système de téléphonie mobile et la version de WeChat répondent aux exigences. Tout d'abord, assurez-vous que la version de votre système de téléphonie mobile Huawei a été mise à jour vers la dernière version, ainsi que l'application WeChat.

Comment télécharger des vidéos de Baidu Netdisk vers des albums photo mobiles Comment enregistrer des vidéos dans des albums photo de téléphone mobile Comment télécharger des vidéos de Baidu Netdisk vers des albums photo mobiles Comment enregistrer des vidéos dans des albums photo de téléphone mobile Mar 13, 2024 am 09:34 AM

De nos jours, de plus en plus d'amis sont particulièrement dépendants du logiciel Baidu Netdisk, et ils peuvent constater que les fonctions ici sont particulièrement riches. Ces fonctions permettent à chacun de les choisir et de les utiliser gratuitement. est très puissant et facile à utiliser. Le très grand espace de stockage peut vraiment vous aider à stocker diverses ressources. Vous ne pourrez jamais trouver ces ressources, que vous soyez au travail ou en train d'étudier, si vous avez un contenu de type document. souhaitez stocker, nous pouvons satisfaire tout le monde. Pour ces ressources de fichiers ici, vous pouvez les visualiser ou les visualiser à tout moment ici. Quoi qu'il en soit, ils sont enregistrés en permanence dans votre compte.

See all articles