golang buang tera air video

WBOY
Lepaskan: 2023-05-14 21:00:36
asal
1151 orang telah melayarinya

Dengan perkembangan Internet, perkongsian dan penyebaran video telah menjadi bahagian penting dalam kehidupan seharian orang ramai. Walau bagaimanapun, dalam banyak kes, kami sering menghadapi masalah tera air apabila menonton video. Untuk meningkatkan pengalaman tontonan kami, artikel ini akan memperkenalkan cara menggunakan Golang untuk mengalih keluar tera air dan menonton video tanpa tera air.

1. Konsep tera air

Tanda air merujuk kepada sejenis imej, teks dan maklumat lain yang dibenamkan dalam media digital (seperti video, gambar, dokumen, dll.) untuk melindungi hak ciptanya dan Mencegah cetak rompak. Tera air biasa termasuk tera air lutsinar, tera air teks, tera air gambar, dsb. Apabila menonton video, tera air akan menjejaskan kesan tontonan dan juga rupa dan rasa kandungan video.

2. Apa itu Golang?

Golang ialah bahasa pengaturcaraan popular yang dibangunkan oleh Google pada 2009 dan dikeluarkan secara rasmi pada 2012. Golang dicirikan oleh sintaks ringkas, konkurensi yang kuat, kecekapan tinggi, dan keselamatan yang baik Oleh itu, ia telah digunakan secara meluas dalam pembangunan bahagian belakang, sistem teragih, pengaturcaraan rangkaian dan bidang lain.

3. Prinsip mengalih keluar tera air video

Sekarang kita tahu apa itu tera air, mari kita lihat prinsip mengalih keluar tera air. Secara amnya, lokasi dan kandungan tera air adalah tetap, jadi kami boleh memadam atau menukar piksel tera air melalui perisian penyuntingan video atau algoritma pemprosesan imej. Walaupun kaedah ini lebih berkesan, ia juga mempunyai beberapa kelemahan, seperti keperluan untuk pemprosesan manual atau kecekapan operasi yang rendah.

Dalam artikel ini, kami akan memperkenalkan cara menggunakan Golang untuk menulis program untuk membuang tera air video. Prinsip pelaksanaan khusus adalah untuk memproses bingkai video, menggunakan algoritma pemprosesan imej untuk mencari lokasi dan saiz tera air, dan melaksanakan operasi seperti penggantian piksel, untuk mencapai tujuan mengalih keluar tera air.

4. Langkah-langkah pelaksanaan

Seterusnya, kami akan memperkenalkan langkah-langkah pelaksanaan cara menggunakan Golang untuk membuang tera air video.

  1. Pasang pustaka bergantung

Sebelum mula menulis program, kami perlu memasang pustaka pemprosesan imej dan pustaka pemprosesan video Golang, yang termasuk penyahkodan video dan sokongan pemprosesan bingkai . Arahan pemasangan adalah seperti berikut:

go get -u github.com/disintegration/gift

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

  1. Baca Fail video dan nyahkod

Kita perlu membaca fail video melalui pustaka GMF dan menyahkod setiap bingkai video menjadi imej untuk pemprosesan selanjutnya. Kod sampel adalah seperti berikut:

inputContext, _ := gmf.NewInputCtx(inputFile)

tunda inputContext.Free()

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

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

videoFrame := gmf.NewFrame()

:NewFrame()

:NewFrame()

S ()

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

videoSwCtx.SetPixelMTFormat(gmf.AV_PIX2>videoSwCtx .SetSrcDims(videoStream.CodecCtx().Width(), videoStream.CodecCtx().Height())

videoSwCtx.SetDstDims(videoStream.CodecCtx().Width.CodecCtx().Width.CodecCtx().Width.CodecCtx() ).Ketinggian ())

videoSwCtx.Init()

if err := videoCodec.Open(nil != nil {

log.Panicln(" Tidak boleh membuka codec video:", err)

}

untuk paket := julat inputContext.GetNewPackets() {

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

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

if err != nil {

log.Panicln("Tidak boleh menyahkod paket :", err)

}

if frame != nil {

videoSwCtx.Scale(frame, videoFrame)

// Tulis bingkai yang diproses

}

}

}

    Proses bingkai video
Seterusnya, kita perlu memproses setiap bingkai Memproses bingkai video dan menggunakan perpustakaan hadiah untuk mengubah suai dan meningkatkan imej. Di dalamnya, kita perlu mencari lokasi dan saiz tera air untuk melakukan perkara seperti penggantian piksel. Kod sampel adalah seperti berikut:

penapis := gift.New(

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

hadiah.Convolution(

[]float32{

-1, -1, -1,

-1, 9 , -1 ,

-1, -1, -1,

},

palsu, palsu, palsu, 0,

),

)

tera air, _ := hadiah.Open("watermark.png")

untuk {

bingkai, err := videoStream.ReadPacket( )

if err != nil {

if err == io.EOF {

break

}

log.Panicln ("Tidak boleh membaca paket:", 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, tera air.Bounds().Dy()/2, gift.LanczosResampling)

watermark = maskSize.Resample(watermark, nol)

watermark = hadiah.Mask(watermark, watermarkMask )

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

}

    Simpan fail video yang diproses
Selepas pemprosesan, kami perlu menggunakan perpustakaan GMF untuk mengekod semula bingkai video yang diubah suai dan menulisnya ke fail baharu. Kod sampel adalah seperti berikut:

outputContext, _ := gmf.NewOutputCtx(outputFile)

defer outputContext.Free()

outputStream := outputContext.NewStream(codec )

jika ralat := outputStream.CodecCtx().SetPixFmt(gmf.AV_PIX_FMT_YUV420P); err != tiada {

log.Panicln("Tidak boleh menetapkan format piksel codec")

}

jika ralat := outputStream.CodecCtx().SetWidth(videoStream. CodecCtx().Lebar()); err != nil {

log.Panicln("Tidak boleh menetapkan lebar codec")

}

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

log.Panicln("Tidak boleh menetapkan ketinggian codec")

}

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

log.Panicln("Tidak boleh menetapkan asas masa codec")

}

jika ralat := outputStream.CodecCtx().SetProfile(gmf. FF_PROFILE_H264_TINGGI_444_PREDIKTIF); err != nil {

log.Panicln("Tidak boleh menetapkan profil codec:", err)

}

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

log.Panicln("Tidak boleh membuka codec:", err)

}

swFrameCtx := gmf.NewSwCtx()

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

swFrameCtx.SetPixelFormat(gmf.AV_PIX_FMT_YUV420P) videoStream .CodecCtx().Width(), videoStream.CodecCtx().Height())

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

swFrameCtx.Init()

untuk saya := 0; i < len(Bingkai bertanda air); i++ {

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

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

if err != nil {

log.Panicln("Tidak boleh mengekod bingkai:", err)

}

pkt.SetPts(int64 (i))

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

log.Panicln("Tidak boleh menulis paket:", err)

}

pkt.Free()

}

outputContext.CloseOutputAndNullify()

五、总结

本文介绍了如何用Golang编写程麑提供了实现步骤和示例代码。这种方式相对于传统的手工处理和基于图像处理算法的方式更加高效和准确,并且代码实厰眰码实厰现但是,在实际使用中,我们也需要注意保护被去除水印的视频版权和知识产来,避免侵犯他人权益。

Atas ialah kandungan terperinci golang buang tera air video. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!