Rumah pembangunan bahagian belakang Golang Golang dan FFmpeg: Bagaimana untuk melaksanakan pemintasan dan penskalaan bingkai video

Golang dan FFmpeg: Bagaimana untuk melaksanakan pemintasan dan penskalaan bingkai video

Sep 27, 2023 am 09:34 AM
video capai golanggolang ffmpegffmpeg

Golang与FFmpeg: 如何实现视频帧截取和缩放

Golang dan FFmpeg: Bagaimana untuk melaksanakan pemintasan dan penskalaan bingkai video, contoh kod khusus diperlukan

Ikhtisar:
Dengan peningkatan keperluan pemprosesan video, orang ramai semakin cenderung untuk menggunakan Golang sebagai bahasa pengaturcaraan untuk pemprosesan video. Sebagai rangka kerja pemprosesan multimedia sumber terbuka yang paling popular dalam industri, FFmpeg menyediakan fungsi yang kaya untuk memproses data audio dan video. Artikel ini akan memperkenalkan cara menggunakan Golang untuk memanggil FFmpeg untuk melaksanakan fungsi pemintasan dan penskalaan bingkai video serta memberikan contoh kod yang sepadan.

Prasyarat:
Sebelum anda bermula, anda perlu memastikan FFmpeg dipasang pada mesin anda dan pembolehubah persekitaran yang betul dikonfigurasikan.

Pemintasan bingkai video:
Mula-mula, mari kita lihat cara melaksanakan pemintasan bingkai video. Dalam FFmpeg, anda boleh menggunakan modul "avformat" untuk membaca fail video dan modul "avcodec" untuk menyahkod bingkai video. Berikut ialah kod contoh mudah:

package main

import (
    "fmt"
    "log"

    "github.com/giorgisio/goav/avcodec"
    "github.com/giorgisio/goav/avformat"
)

func main() {
    // 打开视频文件
    formatContext := avformat.AvformatAllocContext()
    if err := avformat.AvformatOpenInput(&formatContext, "/path/to/video.mp4", nil, nil); err != nil {
        log.Fatal("无法打开视频文件:", err)
    }
    defer avformat.AvformatFreeContext(formatContext)

    // 查找视频流
    if err := formatContext.AvformatFindStreamInfo(nil); err != nil {
        log.Fatal("无法查找视频流:", err)
    }

    var videoStreamIndex int32 = -1
    for i, stream := range formatContext.Streams() {
        if stream.CodecParameters().CodecType() == avformat.AVMEDIA_TYPE_VIDEO {
            videoStreamIndex = int32(i)
            break
        }
    }

    if videoStreamIndex == -1 {
        log.Fatal("找不到视频流")
    }

    // 找到视频解码器
    videoDecoder := avcodec.AvcodecFindDecoder(avcodec.CodecId(formatContext.Streams()[videoStreamIndex].CodecParameters().CodecId()))
    if videoDecoder == nil {
        log.Fatal("无法找到视频解码器")
    }

    // 打开解码器上下文
    videoCodecContext := avcodec.AvcodecAllocContext3(videoDecoder)
    if err := avcodec.AvcodecParametersToContext(videoCodecContext, formatContext.Streams()[videoStreamIndex].CodecParameters()); err != nil {
        log.Fatal("无法打开解码器上下文:", err)
    }

    if err := videoCodecContext.AvcodecOpen2(videoDecoder, nil); err != nil {
        log.Fatal("无法打开解码器:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecContext)

    // 读取视频帧
    packet := avcodec.AvPacketAlloc()
    defer avcodec.AvPacketFree(packet)

    for formatContext.AvReadFrame(packet) >= 0 {
        if packet.StreamIndex() == videoStreamIndex {
            frame := avutil.AvFrameAlloc()
            defer avutil.AvFrameFree(frame)

            if err := videoCodecContext.AvcodecSendPacket(packet); err == nil {
                for videoCodecContext.AvcodecReceiveFrame(frame) == nil {
                    // 处理视频帧
                    fmt.Printf("视频帧:%d
", frame.Pts())
                }
            }
        }
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula menggunakan avformat.AvformatAllocContext() untuk memperuntukkan objek konteks format dan menggunakan avformat.AvformatOpenInput()</ kod >Fail video dibuka. Kemudian, kami menggunakan <code>avformat.AvformatFindStreamInfo() untuk mencari strim video, dan kemudian menggunakan avformat.AVMEDIA_TYPE_VIDEO untuk menentukan sama ada ia adalah strim video. avformat.AvformatAllocContext()来分配一个格式上下文对象,并使用avformat.AvformatOpenInput()打开了一个视频文件。然后,我们使用avformat.AvformatFindStreamInfo()找到了视频流,再使用avformat.AVMEDIA_TYPE_VIDEO来判断是否为视频流。

接下来,我们使用avcodec.AvcodecFindDecoder()来查找适合的解码器,并使用avcodec.AvcodecParametersToContext()avcodec.AvcodecOpen2()打开了解码器上下文。

最后,我们使用formatContext.AvReadFrame()来读取视频帧,并在videoCodecContext.AvcodecReceiveFrame()中处理每一帧。在这个示例中,我们只是简单地打印每一帧的PTS值。

视频缩放:
接下来,我们来看一下如何实现视频帧的缩放。在FFmpeg中,可以使用"swscale"模块来进行视频帧的缩放。以下是一个简单的示例代码:

package main

import (
    "fmt"
    "image"
    "log"
    "os"

    "github.com/giorgisio/goav/avcodec"
    "github.com/giorgisio/goav/avformat"
    "github.com/giorgisio/goav/swscale"
    "github.com/nfnt/resize"
)

func main() {
    // 打开视频文件
    formatContext := avformat.AvformatAllocContext()
    if err := avformat.AvformatOpenInput(&formatContext, "/path/to/video.mp4", nil, nil); err != nil {
        log.Fatal("无法打开视频文件:", err)
    }
    defer avformat.AvformatFreeContext(formatContext)

    // 查找视频流
    if err := formatContext.AvformatFindStreamInfo(nil); err != nil {
        log.Fatal("无法查找视频流:", err)
    }

    var videoStreamIndex int32 = -1
    for i, stream := range formatContext.Streams() {
        if stream.CodecParameters().CodecType() == avformat.AVMEDIA_TYPE_VIDEO {
            videoStreamIndex = int32(i)
            break
        }
    }

    if videoStreamIndex == -1 {
        log.Fatal("找不到视频流")
    }

    // 找到视频解码器
    videoDecoder := avcodec.AvcodecFindDecoder(avcodec.CodecId(formatContext.Streams()[videoStreamIndex].CodecParameters().CodecId()))
    if videoDecoder == nil {
        log.Fatal("无法找到视频解码器")
    }

    // 打开解码器上下文
    videoCodecContext := avcodec.AvcodecAllocContext3(videoDecoder)
    if err := avcodec.AvcodecParametersToContext(videoCodecContext, formatContext.Streams()[videoStreamIndex].CodecParameters()); err != nil {
        log.Fatal("无法打开解码器上下文:", err)
    }

    if err := videoCodecContext.AvcodecOpen2(videoDecoder, nil); err != nil {
        log.Fatal("无法打开解码器:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecContext)

    // 创建视频缩放上下文
    swscaleContext := swscale.SwsGetContext(
        videoCodecContext.Width(), videoCodecContext.Height(), videoCodecContext.PixFmt(),
        videoCodecContext.Width()/2, videoCodecContext.Height()/2, avcodec.AV_PIX_FMT_RGB24,
        0, nil, nil, nil,
    )
    defer swscale.SwsFreeContext(swscaleContext)

    // 创建输出视频文件
    outfile, err := os.Create("/path/to/output.mp4")
    if err != nil {
        log.Fatal("无法创建输出视频文件:", err)
    }
    defer outfile.Close()

    // 创建视频编码器
    videoEncoder := avcodec.AvcodecFindEncoder(avcodec.AV_CODEC_ID_MPEG4)
    if videoEncoder == nil {
        log.Fatal("无法找到视频编码器")
    }

    // 创建编码器上下文
    videoCodecCtx := avcodec.AvcodecAllocContext3(videoEncoder)
    videoCodecCtx.SetBitRate(400000)
    videoCodecCtx.SetWidth(videoCodecContext.Width() / 2)
    videoCodecCtx.SetHeight(videoCodecContext.Height() / 2)
    videoCodecCtx.SetTimeBase(avformat.AVR{Num: 1, Den: 25})
    videoCodecCtx.SetPixFmt(avcodec.AV_PIX_FMT_YUV420P)

    // 打开编码器上下文
    if err := videoCodecCtx.AvcodecOpen2(videoEncoder, nil); err != nil {
        log.Fatal("无法打开编码器上下文:", err)
    }
    defer avcodec.AvcodecFreeContext(videoCodecCtx)

    // 写入视频文件头
    formatContext.SetOutput(outfile)
    if err := formatContext.AvformatWriteHeader(nil); err != nil {
        log.Fatal("无法写入视频文件头:", err)
    }
    defer formatContext.AvformatFreeOutputContext()

    // 准备编码帧和缩放帧
    encodeFrame := avutil.AvFrameAlloc()
    defer avutil.AvFrameFree(encodeFrame)

    encodeFrame.SetWidth(videoCodecCtx.Width())
    encodeFrame.SetHeight(videoCodecCtx.Height())
    encodeFrame.SetFormat(int32(videoCodecCtx.PixFmt()))

    frameSize := avcodec.AvpixelAvImageGetBufferSize(avcodec.AV_PIX_FMT_RGB24, videoCodecCtx.Width()/2, videoCodecCtx.Height()/2, 1)
    encodeFrameBuffer := avutil.AvMalloc(frameSize)
    defer avutil.AvFree(encodeFrameBuffer)

    encodeFrame.AvpixelAvImageFillArrays(encodeFrameBuffer, 1)

    for formatContext.AvReadFrame(packet) >= 0 {
        if packet.StreamIndex() == videoStreamIndex {
            frame := avutil.AvFrameAlloc()
            defer avutil.AvFrameFree(frame)

            if err := videoCodecContext.AvcodecSendPacket(packet); err != nil {
                log.Fatal("无法发送视频包:", err)
            }

            for videoCodecContext.AvcodecReceiveFrame(frame) == nil {
                // 缩放视频帧
                swscale.SwsScale(
                    swscaleContext,
                    frame.Data(), frame.Linesize(),
                    0, frame.Height(),
                    encodeFrame.Data(), encodeFrame.Linesize(),
                )

                // 编码视频帧
                encodeFrame.SetPts(frame.Pts())
                packet := avcodec.AvPacketAlloc()
                if err := avcodec.AvcodecSendFrame(videoCodecCtx, encodeFrame); err != nil {
                    log.Fatal("无法发送编码帧:", err)
                }

                if err := avcodec.AvcodecReceivePacket(videoCodecCtx, packet); err != nil {
                    log.Fatal("无法接收编码包:", err)
                }
                defer avcodec.AvPacketFree(packet)

                // 写入编码后的帧到文件
                if err := formatContext.AvWriteFrame(packet); err != nil {
                    log.Fatal("无法写入帧到文件:", err)
                }
            }
        }
    }

    // 写入视频文件尾
    if err := formatContext.AvWriteTrailer(); err != nil {
        log.Fatal("无法写入视频文件尾:", err)
    }
}
Salin selepas log masuk

以上代码中,我们创建了一个视频缩放上下文swscaleContext,它的输入是原始视频帧的大小,输出是缩放后的视频帧的大小。我们还创建了一个新的编码器上下文videoCodecCtx,它的大小为原始视频帧大小的一半,并将其设置为YUV420P像素格式。

在读取到每一帧视频后,我们使用swscale.SwsScale()

Seterusnya, kami menggunakan avcodec.AvcodecFindDecoder() untuk mencari penyahkod yang sesuai dan menggunakan avcodec.AvcodecParametersToContext() dan avcodec.AvcodecOpen2() membuka konteks penyahkod. <p><br>Akhir sekali, kami menggunakan <code>formatContext.AvReadFrame() untuk membaca bingkai video dan memproses setiap bingkai dalam videoCodecContext.AvcodecReceiveFrame(). Dalam contoh ini, kami hanya mencetak nilai PTS untuk setiap bingkai.

🎜Penskalaan video: 🎜Seterusnya, mari kita lihat cara untuk mencapai penskalaan bingkai video. Dalam FFmpeg, anda boleh menggunakan modul "swscale" untuk menskalakan bingkai video. Berikut ialah kod sampel ringkas: 🎜rrreee🎜Dalam kod di atas, kami mencipta konteks penskalaan video swscaleContext, yang inputnya ialah saiz bingkai video asal, dan outputnya ialah saiz bingkai video berskala. Kami juga mencipta konteks pengekod baharu videoCodecCtx iaitu separuh saiz bingkai video asal dan menetapkannya kepada format piksel YUV420P. 🎜🎜Selepas membaca setiap bingkai video, kami menggunakan fungsi swscale.SwsScale() untuk menskalakannya kepada saiz yang ditentukan dan menghantar bingkai video berskala kepada pengekod untuk pengekodan. Kami kemudian menulis bingkai yang dikodkan ke fail video output. 🎜🎜Ringkasan: 🎜Gabungan Golang dan FFmpeg menyediakan pembangun dengan alat pemprosesan video yang berkuasa. Dalam artikel ini, kami memperkenalkan cara menggunakan Golang untuk memanggil FFmpeg untuk melaksanakan fungsi pemintasan dan penskalaan bingkai video serta memberikan contoh kod yang sepadan. Semoga contoh ini akan membantu anda memahami dengan lebih baik cara menggunakan Golang dan FFmpeg untuk memproses data video. 🎜

Atas ialah kandungan terperinci Golang dan FFmpeg: Bagaimana untuk melaksanakan pemintasan dan penskalaan bingkai 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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
<🎜> obscur: Ekspedisi 33 - Cara mendapatkan pemangkin Chroma yang sempurna
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat 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)

Topik panas

Tutorial Java
1677
14
Tutorial PHP
1278
29
Tutorial C#
1257
24
Adakah ia melanggar untuk menyiarkan video orang lain di Douyin? Bagaimanakah ia mengedit video tanpa pelanggaran? Adakah ia melanggar untuk menyiarkan video orang lain di Douyin? Bagaimanakah ia mengedit video tanpa pelanggaran? Mar 21, 2024 pm 05:57 PM

Dengan peningkatan platform video pendek, Douyin telah menjadi bahagian yang sangat diperlukan dalam kehidupan seharian setiap orang. Di TikTok, kita boleh melihat video menarik dari seluruh dunia. Sesetengah orang suka menyiarkan video orang lain, yang menimbulkan persoalan: Adakah Douyin melanggar apabila menyiarkan video orang lain? Artikel ini akan membincangkan isu ini dan memberitahu anda cara mengedit video tanpa pelanggaran dan cara mengelakkan isu pelanggaran. 1. Adakah ia melanggar penyiaran video orang lain oleh Douyin? Menurut peruntukan Undang-undang Hak Cipta negara saya, penggunaan tanpa kebenaran karya pemilik hak cipta tanpa kebenaran pemilik hak cipta adalah satu pelanggaran. Oleh itu, menyiarkan video orang lain di Douyin tanpa kebenaran pengarang asal atau pemilik hak cipta adalah satu pelanggaran. 2. Bagaimana untuk mengedit video tanpa pelanggaran? 1. Penggunaan domain awam atau kandungan berlesen: Awam

Bagaimana untuk menerbitkan karya video Xiaohongshu? Apakah yang perlu saya perhatikan semasa menyiarkan video? Bagaimana untuk menerbitkan karya video Xiaohongshu? Apakah yang perlu saya perhatikan semasa menyiarkan video? Mar 23, 2024 pm 08:50 PM

Dengan kemunculan platform video pendek, Xiaohongshu telah menjadi platform untuk ramai orang berkongsi kehidupan mereka, meluahkan perasaan mereka dan mendapatkan trafik. Pada platform ini, menerbitkan karya video ialah cara interaksi yang sangat popular. Jadi, bagaimana untuk menerbitkan karya video Xiaohongshu? 1. Bagaimana untuk menerbitkan karya video Xiaohongshu? Mula-mula, pastikan anda mempunyai kandungan video yang sedia untuk dikongsi. Anda boleh menggunakan telefon bimbit anda atau peralatan kamera lain untuk merakam, tetapi anda perlu memberi perhatian kepada kualiti imej dan kejelasan bunyi. 2. Edit video: Untuk menjadikan kerja lebih menarik, anda boleh mengedit video. Anda boleh menggunakan perisian penyuntingan video profesional, seperti Douyin, Kuaishou, dsb., untuk menambah penapis, muzik, sari kata dan elemen lain. 3. Pilih kulit muka: Kulit adalah kunci untuk menarik pengguna untuk mengklik.

Cara menyiarkan video di Weibo tanpa memampatkan kualiti imej_Cara menyiarkan video di Weibo tanpa memampatkan kualiti imej Cara menyiarkan video di Weibo tanpa memampatkan kualiti imej_Cara menyiarkan video di Weibo tanpa memampatkan kualiti imej Mar 30, 2024 pm 12:26 PM

1. Mula-mula buka Weibo pada telefon mudah alih anda dan klik [Saya] di sudut kanan bawah (seperti yang ditunjukkan dalam gambar). 2. Kemudian klik [Gear] di penjuru kanan sebelah atas untuk membuka tetapan (seperti yang ditunjukkan dalam gambar). 3. Kemudian cari dan buka [Tetapan Umum] (seperti yang ditunjukkan dalam gambar). 4. Kemudian masukkan pilihan [Video Follow] (seperti yang ditunjukkan dalam gambar). 5. Kemudian buka tetapan [Video Upload Resolution] (seperti yang ditunjukkan dalam gambar). 6. Akhir sekali, pilih [Kualiti Imej Asal] untuk mengelakkan pemampatan (seperti yang ditunjukkan dalam gambar).

Bagaimana untuk membuat wang daripada menyiarkan video di Douyin? Bagaimanakah seorang pemula boleh membuat wang di Douyin? Bagaimana untuk membuat wang daripada menyiarkan video di Douyin? Bagaimanakah seorang pemula boleh membuat wang di Douyin? Mar 21, 2024 pm 08:17 PM

Douyin, platform video pendek kebangsaan, bukan sahaja membolehkan kami menikmati pelbagai video pendek yang menarik dan novel pada masa lapang kami, tetapi juga memberi kami pentas untuk menunjukkan diri kami dan merealisasikan nilai kami. Jadi, bagaimana untuk membuat wang dengan menyiarkan video di Douyin? Artikel ini akan menjawab soalan ini secara terperinci dan membantu anda menjana lebih banyak wang di TikTok. 1. Bagaimana untuk membuat wang daripada menyiarkan video di Douyin? Selepas menyiarkan video dan mendapat jumlah tontonan tertentu pada Douyin, anda akan berpeluang untuk mengambil bahagian dalam pelan perkongsian pengiklanan. Kaedah pendapatan ini adalah salah satu yang paling biasa kepada pengguna Douyin dan juga merupakan sumber pendapatan utama bagi banyak pencipta. Douyin memutuskan sama ada untuk menyediakan peluang perkongsian pengiklanan berdasarkan pelbagai faktor seperti berat akaun, kandungan video dan maklum balas khalayak. Platform TikTok membolehkan penonton menyokong pencipta kegemaran mereka dengan menghantar hadiah,

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Mar 24, 2024 am 11:27 AM

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Dengan kebangkitan media sosial, WeChat telah menjadi salah satu alat komunikasi yang sangat diperlukan dalam kehidupan seharian orang ramai. Walau bagaimanapun, ramai orang mungkin menghadapi masalah: log masuk ke beberapa akaun WeChat pada masa yang sama pada telefon mudah alih yang sama. Bagi pengguna telefon mudah alih Huawei, tidak sukar untuk mencapai log masuk WeChat dwi Artikel ini akan memperkenalkan cara mencapai log masuk WeChat dwi pada telefon mudah alih Huawei. Pertama sekali, sistem EMUI yang disertakan dengan telefon mudah alih Huawei menyediakan fungsi yang sangat mudah - pembukaan dua aplikasi. Melalui fungsi pembukaan dwi aplikasi, pengguna boleh serentak

Douyin 15 saat terlalu pendek dan saya mahu memanjangkannya. Bagaimana untuk membuat video lebih lama daripada 15 saat? Douyin 15 saat terlalu pendek dan saya mahu memanjangkannya. Bagaimana untuk membuat video lebih lama daripada 15 saat? Mar 22, 2024 pm 08:11 PM

Dengan populariti Douyin, semakin ramai orang suka berkongsi kehidupan, bakat dan kreativiti mereka di platform ini. Had 15 saat Douyin membuatkan ramai pengguna berasa bahawa ia tidak cukup menyeronokkan dan berharap untuk memanjangkan tempoh video. Jadi, bagaimanakah anda boleh memanjangkan tempoh video di Douyin? 1. Douyin 15 saat terlalu pendek Jika anda ingin memanjangkannya, bagaimana anda boleh memanjangkannya? 1. Cara paling mudah untuk merakam berbilang video dan menggabungkannya ialah dengan merakam berbilang video 15 saat, dan kemudian gunakan fungsi penyuntingan Douyin untuk menggabungkannya. Semasa merakam, pastikan anda meninggalkan sedikit ruang kosong pada permulaan dan penghujung setiap video untuk penyambungan kemudian. Panjang video yang disambung boleh menjadi beberapa minit, tetapi ini boleh menyebabkan skrin video bertukar terlalu kerap, menjejaskan pengalaman menonton. 2. Gunakan kesan khas dan pelekat Douyin Douyin menyediakan satu siri kesan khas

Selain CNN, Transformer dan Uniformer, kami akhirnya mempunyai teknologi pemahaman video yang lebih cekap Selain CNN, Transformer dan Uniformer, kami akhirnya mempunyai teknologi pemahaman video yang lebih cekap Mar 25, 2024 am 09:16 AM

Matlamat teras pemahaman video adalah untuk memahami perwakilan spatiotemporal dengan tepat, tetapi ia menghadapi dua cabaran utama: terdapat sejumlah besar redundansi spatiotemporal dalam klip video pendek dan kebergantungan spatiotemporal yang kompleks. Rangkaian saraf konvolusi tiga dimensi (CNN) dan Transformer video telah menunjukkan prestasi yang baik dalam menyelesaikan salah satu cabaran ini, tetapi mereka mempunyai kelemahan tertentu dalam menangani kedua-dua cabaran secara serentak. UniFormer cuba untuk menggabungkan kelebihan kedua-dua pendekatan, tetapi menghadapi kesukaran dalam memodelkan video panjang. Kemunculan penyelesaian kos rendah seperti S4, RWKV dan RetNet dalam bidang pemprosesan bahasa semula jadi telah membuka jalan baharu untuk model visual. Mamba menonjol dengan Model Ruang Negeri Terpilih (SSM), yang membolehkan dinamik jangka panjang sambil mengekalkan kerumitan linear.

Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Mar 20, 2024 pm 04:54 PM

Bahasa pengaturcaraan PHP ialah alat yang berkuasa untuk pembangunan web, yang mampu menyokong pelbagai logik dan algoritma pengaturcaraan yang berbeza. Antaranya, melaksanakan jujukan Fibonacci adalah masalah pengaturcaraan biasa dan klasik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa pengaturcaraan PHP untuk melaksanakan jujukan Fibonacci, dan melampirkan contoh kod tertentu. Jujukan Fibonacci ialah jujukan matematik yang ditakrifkan seperti berikut: unsur pertama dan kedua bagi jujukan ialah 1, dan bermula dari unsur ketiga, nilai setiap unsur adalah sama dengan jumlah dua unsur sebelumnya. Beberapa elemen pertama urutan

See all articles