当前位置:首页>活动 >

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。_环球快看

时间:2023-02-23 03:14:05    来源:腾讯云


(资料图)

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

答案2023-02-21:

使用 github.com/moonfdd/ffmpeg-go 库,这个库比goav还好用。

代码根据05:解码视频流过程用golang编写。

执行命令:

go run ./examples/a05video_decode_flow/main.go

代码用golang编写。代码如下:

package mainimport ("fmt""os""github.com/moonfdd/ffmpeg-go/ffcommon""github.com/moonfdd/ffmpeg-go/libavcodec""github.com/moonfdd/ffmpeg-go/libavformat""github.com/moonfdd/ffmpeg-go/libavutil")func main() {os.Setenv("Path", os.Getenv("Path")+";./lib")ffcommon.SetAvutilPath("./lib/avutil-56.dll")ffcommon.SetAvcodecPath("./lib/avcodec-58.dll")ffcommon.SetAvdevicePath("./lib/avdevice-56.dll")ffcommon.SetAvfilterPath("./lib/avfilter-56.dll")ffcommon.SetAvformatPath("./lib/avformat-58.dll")ffcommon.SetAvpostprocPath("./lib/postproc-55.dll")ffcommon.SetAvswresamplePath("./lib/swresample-3.dll")ffcommon.SetAvswscalePath("./lib/swscale-5.dll")filePath := "./resources/big_buck_bunny.mp4" //文件地址videoStreamIndex := -1                       //视频流所在流序列中的索引ret := int32(0)                              //默认返回值//需要的变量名并初始化var fmtCtx *libavformat.AVFormatContextvar pkt *libavcodec.AVPacketvar codecCtx *libavcodec.AVCodecContextvar avCodecPara *libavcodec.AVCodecParametersvar codec *libavcodec.AVCodeclibavformat.AvformatNetworkInit()for {//=========================== 创建AVFormatContext结构体 ===============================////分配一个AVFormatContext,FFMPEG所有的操作都要通过这个AVFormatContext来进行fmtCtx = libavformat.AvformatAllocContext()//==================================== 打开文件 ======================================//ret = libavformat.AvformatOpenInput(&fmtCtx, filePath, nil, nil)if ret != 0 {fmt.Printf("cannot open video file\n")break}//=================================== 获取视频流信息 ===================================//ret = fmtCtx.AvformatFindStreamInfo(nil)if ret < 0 {fmt.Printf("cannot retrive video info\n")break}//循环查找视频中包含的流信息,直到找到视频类型的流//便将其记录下来 保存到videoStreamIndex变量中for i := uint32(0); i < fmtCtx.NbStreams; i++ {if fmtCtx.GetStream(i).Codecpar.CodecType == libavutil.AVMEDIA_TYPE_VIDEO {videoStreamIndex = int(i)break //找到视频流就退出}}//如果videoStream为-1 说明没有找到视频流if videoStreamIndex == -1 {fmt.Printf("cannot find video stream\n")break}//打印输入和输出信息:长度 比特率 流格式等fmtCtx.AvDumpFormat(0, filePath, 0)//=================================  查找解码器 ===================================//avCodecPara = fmtCtx.GetStream(uint32(videoStreamIndex)).Codecparcodec = libavcodec.AvcodecFindDecoder(avCodecPara.CodecId)if codec == nil {fmt.Printf("cannot find decoder\n")break}//根据解码器参数来创建解码器内容codecCtx = codec.AvcodecAllocContext3()codecCtx.AvcodecParametersToContext(avCodecPara)if codecCtx == nil {fmt.Printf("Cannot alloc context.")break}//================================  打开解码器 ===================================//ret = codecCtx.AvcodecOpen2(codec, nil)if ret < 0 { // 具体采用什么解码器ffmpeg经过封装 我们无须知道fmt.Printf("cannot open decoder\n")break}//=========================== 分配AVPacket结构体 ===============================//i := 0                                            //用于帧计数pkt = libavcodec.AvPacketAlloc()                  //分配一个packetpkt.AvNewPacket(codecCtx.Width * codecCtx.Height) //调整packet的数据//===========================  读取视频信息 ===============================//for fmtCtx.AvReadFrame(pkt) >= 0 { //读取的是一帧视频  数据存入一个AVPacket的结构中if pkt.StreamIndex == uint32(videoStreamIndex) {i++ //只计算视频帧}pkt.AvPacketUnref() //重置pkt的内容}fmt.Printf("There are %d frames int total.\n", i)break}//===========================释放所有指针===============================//libavcodec.AvPacketFree(&pkt)codecCtx.AvcodecClose()libavformat.AvformatCloseInput(&fmtCtx)fmtCtx.AvformatFreeContext()}
在这里插入图片描述
标签: 视频处理

上一篇:

下一篇:

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。_环球快看

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

2023-02-23

桥梁挡土墙和护坡_挡土墙和护坡的区别|世界热文

1、挡土墙和护坡区别在于:挡土墙能够承受其墙背后面那块契形的土压力;而护坡本身基本上不承担土压。2、只是能够防止雨水冲刷

2023-02-22

飞荣达: 关于部分董事、高级管理人员股份减持计划实施进展暨时间过半的公告 动态焦点

飞荣达:关于部分董事、高级管理人员股份减持计划实施进展暨时间过半的公告

2023-02-22

盐城东方投资35亿元私募债券项目状态更新为“已反馈”

乐居财经孙肃博2月22日,上交所公司债券项目信息平台显示,“盐城东方投资开发集团有限公司2022年面向专业投资者非公开发行公司债券”项目状态

2023-02-22

聚焦:蔷薇花期有多长时间_蔷薇花期

1、蔷薇是个太美丽的物种,它颜色百变,形状万千,每一面都让人迷恋,如果你在家里的围墙上选择用蔷薇装饰,成片的烂漫一定会让

2023-02-22

环球最资讯丨环球漫评|“五个一百”:唱响新时代奋斗者之歌

时光的表盘上,总有一些闪耀的时刻,标注着历史的进程。岁月的年轮中,总有一圈斑斓的光影,描绘着未来的华章。连日来,由中央网

2023-02-22

环球速看:web微信网页版_web微信

1、双击打开微信WEB开发工具,会弹出如图1所示的微信开发者工具界面。这里需要用微信扫描二维码登录。扫描二维码后的结果如

2023-02-22

世界球精选!广告两字看不清、关闭按钮找不着……刷App为何总点进广告?

“快充6分钟,续航200公里,新能源汽车上市了。”北京市民王先生最近正准备买车,在浏览某App时看到这则“新闻”,立即点

2023-02-22

环球短讯!宋承宪喜欢刘亦菲的证据_宋承宪喜欢刘亦菲

1、刚开始肯定是有感情才会在一起的,只是后面因为各种原因,感情变淡就分手了。2、感情这种事如人饮水,冷暖自知,外人不好说

2023-02-22

糖尿病人一周食谱表格_糖尿病人一周食谱

糖尿病患者的饮食一直是令患者和医生头疼的问题,因为饮食控制不好影响治疗效果,严格的饮食控制影响生活质量。那么什么样的饮食

2023-02-21

X 关闭

X 关闭