Rumah pembangunan bahagian belakang Golang golang buang tera air video

golang buang tera air video

May 14, 2023 pm 09:00 PM

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!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Bagaimana anda menulis ujian unit di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

See all articles