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.
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
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
}
}
}
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)
}
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!