发布时间:2024-12-22 23:48:46
首先,我们需要导入golang的ffmpeg库,并定义一个包含视频路径的变量。
```go import ( "github.com/giorgisio/goav/avcodec" "github.com/giorgisio/goav/avformat" ) func main() { videoPath := "path/to/video.mp4" } ```接下来,我们需要打开视频文件,并读取其中的帧。
```go codec, err := avcodec.AvcodecFindDecoder(avcodec.AV_CODEC_ID_H264) if err != nil { panic(err) } formatContext := avformat.AvformatAllocContext() if err = avformat.AvformatOpenInput(&formatContext, videoPath, nil, nil); err != nil { panic(err) } if err = avformat.AvformatFindStreamInfo(formatContext, nil); err != nil { panic(err) } videoStreamIndex := -1 for i, stream := range formatContext.Streams() { if stream.CodecParameters().CodecType() == avcodec.AVMEDIA_TYPE_VIDEO { videoStreamIndex = i break } } if videoStreamIndex == -1 { panic("No video stream found") } codecContext := formatContext.Streams()[videoStreamIndex].Codec() if err = avcodec.AvcodecOpen2(codecContext, codec, nil); err != nil { panic(err) } frame := avutil.AvFrameAlloc() packet := avcodec.AvPacketAlloc() defer func() { avutil.AvFrameFree(frame) avcodec.AvPacketFree(packet) avcodec.AvcodecFreeContext(codecContext) avformat.AvformatCloseInput(formatContext) }() ```接下来,我们需要读取视频的每一帧,并获取帧的宽高信息。
```go for avformat.AvReadFrame(formatContext, packet) >= 0 { if packet.StreamIndex() == videoStreamIndex { avcodec.AvcodecSendPacket(codecContext, packet) for avcodec.AvcodecReceiveFrame(codecContext, frame) == nil { width := int(frame.Width()) height := int(frame.Height()) // 在这里可以打印或处理视频宽高信息 fmt.Printf("视频宽度:%d, 视频高度:%d\n", width, height) } } avcodec.AvPacketUnref(packet) } ```最后,我们需要释放所有使用的资源。
```go avutil.AvFrameFree(frame) avcodec.AvPacketFree(packet) avcodec.AvcodecFreeContext(codecContext) avformat.AvformatCloseInput(formatContext) ```