


Golang et FFmpeg : Comment implémenter l'interception et la mise à l'échelle d'images vidéo
Golang et FFmpeg : Comment implémenter l'interception et la mise à l'échelle d'images vidéo, des exemples de code spécifiques sont nécessaires
Aperçu :
Avec l'augmentation des besoins en traitement vidéo, les gens sont de plus en plus enclins à utiliser Golang comme langage de programmation pour le traitement vidéo. En tant que framework de traitement multimédia open source le plus populaire du secteur, FFmpeg fournit des fonctions riches pour traiter les données audio et vidéo. Cet article expliquera comment utiliser Golang pour appeler FFmpeg afin d'implémenter les fonctions d'interception et de mise à l'échelle d'images vidéo, et fournira des exemples de code correspondants.
Prérequis :
Avant de commencer, vous devez vous assurer que FFmpeg est installé sur votre machine et que les variables d'environnement correctes sont configurées.
Interception d'images vidéo :
Tout d'abord, voyons comment mettre en œuvre l'interception d'images vidéo. Dans FFmpeg, vous pouvez utiliser le module « avformat » pour lire les fichiers vidéo et le module « avcodec » pour décoder les images vidéo. Voici un exemple de code simple :
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()) } } } } }
Dans le code ci-dessus, nous utilisons d'abord avformat.AvformatAllocContext()
pour allouer un objet de contexte de format, et utilisons avformat.AvformatOpenInput()</ code >Un fichier vidéo est ouvert. Ensuite, nous utilisons <code>avformat.AvformatFindStreamInfo()
pour trouver le flux vidéo, puis utilisons avformat.AVMEDIA_TYPE_VIDEO
pour déterminer s'il s'agit d'un flux vidéo. 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) } }
以上代码中,我们创建了一个视频缩放上下文swscaleContext
,它的输入是原始视频帧的大小,输出是缩放后的视频帧的大小。我们还创建了一个新的编码器上下文videoCodecCtx
,它的大小为原始视频帧大小的一半,并将其设置为YUV420P像素格式。
在读取到每一帧视频后,我们使用swscale.SwsScale()
avcodec.AvcodecFindDecoder()
pour trouver un décodeur approprié, et utilisons avcodec.AvcodecParametersToContext()
et avcodec.AvcodecOpen2() ouvre le contexte du décodeur. <p><br>Enfin, nous utilisons <code>formatContext.AvReadFrame()
pour lire les images vidéo et traiter chaque image dans videoCodecContext.AvcodecReceiveFrame()
. Dans cet exemple, nous imprimons simplement la valeur PTS pour chaque image. 🎜Mise à l'échelle vidéo : 🎜Ensuite, voyons comment réaliser la mise à l'échelle de l'image vidéo. Dans FFmpeg, vous pouvez utiliser le module « swscale » pour mettre à l'échelle les images vidéo. Voici un exemple de code simple : 🎜rrreee🎜Dans le code ci-dessus, nous créons un contexte de mise à l'échelle vidéo swscaleContext
, dont l'entrée est la taille de l'image vidéo d'origine et la sortie est la taille de la image vidéo mise à l'échelle. Nous créons également un nouveau contexte d'encodeur videoCodecCtx
qui fait la moitié de la taille de l'image vidéo d'origine et le définissons au format de pixel YUV420P. 🎜🎜Après avoir lu chaque image vidéo, nous utilisons la fonction swscale.SwsScale()
pour la redimensionner à la taille spécifiée et envoyer l'image vidéo mise à l'échelle à l'encodeur pour l'encodage. Nous écrivons ensuite les images codées dans le fichier vidéo de sortie. 🎜🎜Résumé : 🎜La combinaison de Golang et FFmpeg offre aux développeurs un puissant outil de traitement vidéo. Dans cet article, nous expliquons comment utiliser Golang pour appeler FFmpeg afin d'implémenter les fonctions d'interception et de mise à l'échelle d'images vidéo, et fournissons des exemples de code correspondants. Espérons que ces exemples vous aideront à mieux comprendre comment utiliser Golang et FFmpeg pour traiter les données vidéo. 🎜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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Avec l'essor des plateformes de vidéos courtes, Douyin est devenu un élément indispensable de la vie quotidienne de chacun. Sur TikTok, nous pouvons voir des vidéos intéressantes du monde entier. Certaines personnes aiment publier les vidéos d’autres personnes, ce qui soulève une question : Douyin enfreint-il la publication de vidéos d’autres personnes ? Cet article abordera ce problème et vous expliquera comment éditer des vidéos sans infraction et comment éviter les problèmes d'infraction. 1. Cela porte-t-il atteinte à la publication par Douyin de vidéos d'autres personnes ? Selon les dispositions de la loi sur le droit d'auteur de mon pays, l'utilisation non autorisée des œuvres du titulaire du droit d'auteur sans l'autorisation du titulaire du droit d'auteur constitue une infraction. Par conséquent, publier des vidéos d’autres personnes sur Douyin sans l’autorisation de l’auteur original ou du titulaire des droits d’auteur constitue une infraction. 2. Comment monter une vidéo sans contrefaçon ? 1. Utilisation de contenu du domaine public ou sous licence : Public

Douyin, la plateforme nationale de courtes vidéos, nous permet non seulement de profiter d'une variété de courtes vidéos intéressantes et originales pendant notre temps libre, mais nous donne également une scène pour nous montrer et réaliser nos valeurs. Alors, comment gagner de l’argent en postant des vidéos sur Douyin ? Cet article répondra à cette question en détail et vous aidera à gagner plus d’argent sur TikTok. 1. Comment gagner de l’argent en publiant des vidéos sur Douyin ? Après avoir posté une vidéo et obtenu un certain nombre de vues sur Douyin, vous aurez la possibilité de participer au plan de partage publicitaire. Cette méthode de revenus est l’une des plus connues des utilisateurs de Douyin et constitue également la principale source de revenus pour de nombreux créateurs. Douyin décide d'offrir ou non des opportunités de partage de publicités en fonction de divers facteurs tels que le poids du compte, le contenu vidéo et les commentaires du public. La plateforme TikTok permet aux téléspectateurs de soutenir leurs créateurs préférés en envoyant des cadeaux,

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Avec l’essor des réseaux sociaux, WeChat est devenu l’un des outils de communication indispensables dans la vie quotidienne des gens. Cependant, de nombreuses personnes peuvent rencontrer un problème : se connecter à plusieurs comptes WeChat en même temps sur le même téléphone mobile. Pour les utilisateurs de téléphones mobiles Huawei, il n'est pas difficile d'obtenir une double connexion WeChat. Cet article explique comment obtenir une double connexion WeChat sur les téléphones mobiles Huawei. Tout d'abord, le système EMUI fourni avec les téléphones mobiles Huawei offre une fonction très pratique : l'ouverture d'une double application. Grâce à la fonction de double ouverture de l'application, les utilisateurs peuvent simultanément

1. Ouvrez d'abord Weibo sur votre téléphone mobile et cliquez sur [Moi] dans le coin inférieur droit (comme indiqué sur l'image). 2. Cliquez ensuite sur [Gear] dans le coin supérieur droit pour ouvrir les paramètres (comme indiqué sur l'image). 3. Ensuite, recherchez et ouvrez [Paramètres généraux] (comme indiqué sur l'image). 4. Entrez ensuite l'option [Video Follow] (comme indiqué sur l'image). 5. Ensuite, ouvrez le paramètre [Résolution de téléchargement vidéo] (comme indiqué sur l'image). 6. Enfin, sélectionnez [Qualité d'image originale] pour éviter la compression (comme indiqué sur l'image).

Avec l'essor des plateformes de vidéos courtes, Xiaohongshu est devenue une plateforme permettant à de nombreuses personnes de partager leur vie, de s'exprimer et de gagner du trafic. Sur cette plateforme, la publication d’œuvres vidéo est un moyen d’interaction très prisé. Alors, comment publier les œuvres vidéo de Xiaohongshu ? 1. Comment publier les œuvres vidéo de Xiaohongshu ? Tout d’abord, assurez-vous d’avoir un contenu vidéo prêt à partager. Vous pouvez utiliser votre téléphone portable ou un autre équipement photo pour prendre des photos, mais vous devez faire attention à la qualité de l'image et à la clarté du son. 2. Editer la vidéo : Afin de rendre le travail plus attrayant, vous pouvez éditer la vidéo. Vous pouvez utiliser un logiciel de montage vidéo professionnel, tel que Douyin, Kuaishou, etc., pour ajouter des filtres, de la musique, des sous-titres et d'autres éléments. 3. Choisissez une couverture : La couverture est la clé pour inciter les utilisateurs à cliquer. Choisissez une image claire et intéressante comme couverture pour inciter les utilisateurs à cliquer dessus.

La présentation Microsoft PowerPoint est l'un de nos logiciels bureautiques couramment utilisés. Afin de présenter le contenu à expliquer de manière complète et détaillée, la vidéo est l'une des méthodes de présentation importantes. Vous savez, lorsque nous insérons des vidéos dans PPT, que ce soit via des hyperliens ou des contrôles WindowsMediaPlayer, nous devons prendre en compte les problèmes de chemin. Donc, si nous voulons intégrer une vidéo PPT et la combiner dans un fichier, comment devons-nous le résoudre ? Voyons ensuite la solution ! Les étapes sont les suivantes : 1. Tout d'abord, nous double-cliquons pour ouvrir la présentation Microsoft PowerPoint [Video Embed.pptx]. Grâce à l'utilisation de ShockwaveFlashO

Comment mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei Avec la popularité des logiciels sociaux et l'importance croissante accordée à la confidentialité et à la sécurité, la fonction de clonage WeChat est progressivement devenue le centre d'attention. La fonction de clonage WeChat peut aider les utilisateurs à se connecter simultanément à plusieurs comptes WeChat sur le même téléphone mobile, ce qui facilite la gestion et l'utilisation. Il n'est pas difficile de mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei. Il vous suffit de suivre les étapes suivantes. Étape 1 : Assurez-vous que la version du système de téléphonie mobile et la version de WeChat répondent aux exigences. Tout d'abord, assurez-vous que la version de votre système de téléphonie mobile Huawei a été mise à jour vers la dernière version, ainsi que l'application WeChat.

De nos jours, de plus en plus d'amis sont particulièrement dépendants du logiciel Baidu Netdisk, et ils peuvent constater que les fonctions ici sont particulièrement riches. Ces fonctions permettent à chacun de les choisir et de les utiliser gratuitement. est très puissant et facile à utiliser. Le très grand espace de stockage peut vraiment vous aider à stocker diverses ressources. Vous ne pourrez jamais trouver ces ressources, que vous soyez au travail ou en train d'étudier, si vous avez un contenu de type document. souhaitez stocker, nous pouvons satisfaire tout le monde. Pour ces ressources de fichiers ici, vous pouvez les visualiser ou les visualiser à tout moment ici. Quoi qu'il en soit, ils sont enregistrés en permanence dans votre compte.
