Maison> développement back-end> Golang> le corps du texte

Golang supprime le filigrane vidéo

WBOY
Libérer: 2023-05-14 21:00:36
original
1082 Les gens l'ont consulté

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!

source:php.cn
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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!