Maison développement back-end Golang Golang supprime le filigrane vidéo

Golang supprime le filigrane vidéo

May 14, 2023 pm 09:00 PM

Avec le développement d'Internet, le partage et la diffusion de vidéos sont devenus un élément important de la vie quotidienne des gens. Cependant, dans de nombreux cas, nous rencontrons souvent des problèmes de filigrane lorsque nous regardons des vidéos. Afin d'améliorer notre expérience visuelle, cet article explique comment utiliser Golang pour supprimer les filigranes et regarder des vidéos sans filigrane.

1. Le concept de filigrane

Le filigrane fait référence à une sorte d'image, de texte et d'autres informations intégrées dans des supports numériques (tels que des vidéos, des images, des documents, etc.) pour protéger ses droits d'auteur et prévenir le piratage. Les filigranes courants incluent les filigranes transparents, les filigranes de texte, les filigranes d'image, etc. Lorsque vous regardez des vidéos, les filigranes affecteront l’effet de visualisation et même l’apparence du contenu vidéo.

2. Qu'est-ce que Golang ?

Golang est un langage de programmation populaire développé par Google en 2009 et officiellement lancé en 2012. Golang se caractérise par une syntaxe concise, une forte concurrence, une efficacité élevée et une bonne sécurité. Par conséquent, il a été largement utilisé dans le développement back-end, les systèmes distribués, la programmation réseau et d'autres domaines.

3. Le principe de la suppression du filigrane vidéo

Maintenant que nous savons ce qu'est le filigrane, examinons le principe de la suppression du filigrane. Généralement, l'emplacement et le contenu du filigrane sont fixes, nous pouvons donc supprimer ou modifier les pixels du filigrane via un logiciel de montage vidéo ou des algorithmes de traitement d'image. Bien que cette méthode soit plus efficace, elle présente également certains inconvénients, tels que la nécessité d'un traitement manuel ou une faible efficacité opérationnelle.

Dans cet article, nous présenterons une façon d'écrire un programme utilisant Golang pour supprimer les filigranes vidéo. Le principe de mise en œuvre spécifique consiste à traiter les images vidéo, à utiliser des algorithmes de traitement d'image pour trouver l'emplacement et la taille du filigrane et à effectuer des opérations telles que le remplacement des pixels, pour finalement atteindre l'objectif de suppression du filigrane.

4. Étapes de mise en œuvre

Ensuite, nous présenterons les étapes de mise en œuvre pour utiliser Golang pour supprimer les filigranes vidéo.

  1. Installer les bibliothèques dépendantes

Avant de commencer à écrire le programme, nous devons installer la bibliothèque de traitement d'image et la bibliothèque de traitement vidéo de Golang, qui incluent la prise en charge du décodage vidéo et du traitement des images. La commande d'installation est la suivante :

go get -u github.com/disintegration/gift

go get -u github.com/3d0c/gmf

  1. Lire le fichier vidéo et le décoder

Nous devons lire la vidéo via le fichier de bibliothèque GMF et décode chaque image vidéo en une image pour un traitement ultérieur. L'exemple de code est le suivant :

inputContext, _ := gmf.NewInputCtx(inputFile)

defer inputContext.Free()

videoStream, _ := inputContext.GetBestStream(gmf.AVMEDIA_TYPE_VIDEO)

videoCodec, _ := gmf.FindEncoder (gmf.AV_CODEC_ID_RAWVIDEO)

videoFrame := gmf.NewFrame()

videoSwCtx := gmf.NewSwCtx()

videoSwCtx.SetSize(videoStream.CodecCtx().Width(), videoStream.CodecCtx(). Height() )

videoSwCtx.SetPixelFormat(gmf.AV_PIX_FMT_RGB24)

videoSwCtx.SetSrcDims(videoStream.CodecCtx().Width(), videoStream.CodecCtx().Height())

videoSwCtx.SetDstDims(videoStre suis CodecCtx( ).Width (), videoStream.CodecCtx().Height())

videoSwCtx.Init()

if err := videoCodec.Open(nil); = nil {

log.Panicln("Impossible d'ouvrir codec vidéo : ", err)

}

for packet := range inputContext.GetNewPackets() {

if packet.StreamIndex() == videoStream.Index() {

frame, err := packet.Decode( videoStream.CodecCtx ())

if err != nil {

log.Panicln("Impossible de décoder le paquet :", err)

}

if frame != nil {

videoSwCtx.Scale(frame, videoFrame)

/ /Écrire les images traitées

}

}

}

  1. Traitement des images vidéo

Ensuite, nous devons traiter chaque image vidéo et utiliser la bibliothèque de cadeaux pour modifier et améliorer l'image. Dans celui-ci, nous devons trouver l'emplacement et la taille du filigrane afin d'effectuer des tâches telles que le remplacement des pixels. L'exemple de code est le suivant :

filter := gift.New(

gift.Resize(videoStream.CodecCtx().Width(), videoStream.CodecCtx().Height(), gift.LanczosResampling),

gift .Convolution(

[]float32{

-1, -1, -1,

-1, 9, -1,

-1, -1, -1,

},

faux, faux , false, 0,

),

)

watermark, _ := gift.Open("watermark.png")

for {

frame, err := videoStream.ReadPacket()

if err ! = nil {

if err == io.EOF {

break

}

log.Panicln("Impossible de lire le paquet :", err)

}

videoFrame.SetPts(frame.Pts())

videoSwCtx. Scale(frame, videoFrame)

watermarkMask := gift.NewPolarMask(watermark.Bounds(), watermark.Bounds().Center(), 0.5)

maskSize := gift.Resize(watermark.Bounds() .Dx( )/2, watermark.Bounds().Dy()/2, gift.LanczosResampling)

watermark = maskSize.Resample(watermark, nil)

watermark = gift.Mask(watermark, watermarkMask)

filter .DrawAt( videoFrame, watermarkedFrame, image.Point{0, 0}, gift.OverOperator)

}

  1. Enregistrez le fichier vidéo traité

Après le traitement, nous devons utiliser la bibliothèque GMF pour réencoder le fichier modifié images vidéo et écrivez-les dans un nouveau fichier. L'exemple de code est le suivant :

outputContext, _ := gmf.NewOutputCtx(outputFile)

defer outputContext.Free()

outputStream := outputContext.NewStream(codec)

if err := outputStream.CodecCtx().SetPixFmt(gmf.AV_PIX_FMT_YUV420P); err != nil {

log.Panicln("Impossible de définir le format de pixel du codec")

}

if err := outputStream.CodecCtx().SetWidth(videoStream.CodecCtx().Width()); err != nil {

log.Panicln("Impossible de définir la largeur du codec")

}

if err := outputStream.CodecCtx().SetHeight(videoStream.CodecCtx().Height()); err != nil {

log.Panicln("Impossible de définir la hauteur du codec")

}

if err := outputStream.CodecCtx().SetTimeBase(avrational.AVR{Num : 1, Den : 25}); err != nil {

log.Panicln("Impossible de définir la base de temps du codec")

}

if err := outputStream.CodecCtx().SetProfile(gmf.FF_PROFILE_H264_HIGH_444_PREDICTIVE); err != nil {

log.Panicln("Impossible de définir le profil de codec :", err)

}

if err := outputStream.CodecCtx().Open(nil); err != nil {

log.Panicln("Impossible d'ouvrir le codec :", err)

}

swFrameCtx := gmf.NewSwCtx()

swFrameCtx.SetSize(videoStream.CodecCtx().Width(), videoStream .CodecCtx().Height())

swFrameCtx.SetPixelFormat(gmf.AV_PIX_FMT_YUV420P)

swFrameCtx.SetSrcDims(videoStream.CodecCtx().Width(), videoStream.CodecCtx().Height())

swFrame Ctx.SetDstDims (videoStream.CodecCtx().Width(), videoStream.CodecCtx().Height())

swFrameCtx.Init()

for i := 0; je &Lt ; len (Frames filigranés); i++ {

swFrameCtx.Scale(watermarkedFrames[i], outputStream.CodecCtx(), gmf.SWS_FAST_BILINEAR)

pkt, err := outputStream.CodecCtx().Encode(watermarkedFrames[i])

if err != nil {

log.Panicln("Impossible d'encoder le cadre :", err)

}

pkt.SetPts(int64(i))

if err := outputStream.WritePacket(pkt); err != nil {

log.Panicln("Cannot write packet:", err)

}

pkt.Free()

}

outputContext.CloseOutputAndNullify()

五、总结

本文介绍了Le Golang s'appelle Golang.在实际使用中,我们也需要注意保护被去除水印的视频版权和知识产权,避免侵犯他人权益。

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

Article chaud

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

Article chaud

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

Tags d'article chaud

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)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

Comment rédigez-vous des tests unitaires en Go?

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Comment écrire des fichiers dans GO Language de manière pratique?

See all articles