2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。
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文件,输出视频信息和总帧数。相关推荐
- Ubuntu 下使用go语言调用ffmpeg推流
Ubuntu 下使用go语言调用ffmpeg推流Ubuntu 下使用go语言调用ffmpeg推流 win10 安装 Ubuntu Windows Subsystem for Linux(WSL)适用于 ...
- C++调用ffmpeg批量合并bilibili缓存视频
文章目录 前言 一.先看效果 二.开始写代码 1.遍历文件 2.获取视频标题和视频名称 3.生成视频 4.主函数 总结 前言 手机bilibili缓存了很多视频,想导入电脑看,但发现缓存的视频被分割成 ...
- C#调用FFMPEG,并异步读取输出信息的代码
public void ConvertVideo() { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = @"c:\f ...
- 信息学奥赛训练体系(2023.02.21)
信息学奥赛寒假.暑假.国庆十一假期 如何进行集训 信息学奥赛寒假.暑假.国庆十一假期 如何进行集训_dllglvzhenfeng的博客-CSDN博客 信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 ...
- go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...
Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...
- Linux下C语言调用paly播放音频文件
一.安装sox播放器 sox播放器支持流行的多种类型的音频文件 sudo apt-get install sox sudo apt-get install sox libsox-fmt-all 二.在 ...
- c语言乘法表只有结果,要求输出结果显示相乘的两数及乘积怎么做?
1. #include void main() { int i,j; printf("* "); for(i=1;i=10) printf("%d ",i*j) ...
- C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)【笔记】
不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...
- 题目描述请参照本章例题,编写一个程序,输出以下信息:************************** Very Good**********************
输入 无需输入 输出 ************************** Very Good! ************************** 样例输出 ******* ...
最新文章
- 【转】卡尔曼滤波算法详细推导(相当值得一看)
- 第十三周项目4-数组的排序:冒泡排序
- UVa 164 - String Computer
- 大工14春《计算机应用基础》在线测试2,大工14春《计算机应用基础》在线测试2...
- python读取指定行到最后一行_python读取文件最后一行两种方法
- 敏捷开发系列学习总结(17)——团队需要Scrum Master做这六件事
- Git正确的协作方式(很简单)
- 数据--第28课 - 进阶星移
- nanomsg应用中的问题整理
- 手机android微信文件怎么恢复,微信文件过期或被清理怎么恢复?好工具,帮你安全快速找回文件!...
- UOJ #11.【UTR #1】ydc的大树 题解
- 关于《那些年啊,那些事——一个程序员的奋斗史》的更新
- 实施化化工厂人员定位系统势在必行,你不知道的化化工厂人员定位
- matlab 点顺时针排序,按顺时针顺序对点排序?
- pika详解(五)登录认证及connectionParameters
- 1月第2周业务风控关注 | 微信打击盗用他人的身份恶意注册,去年处理300多万例
- 怎样去查询Unity的API文档
- vmware虚拟机修改mac地址
- 【测试必备】汉化Postman竟如此简单,秒变中文,真香
- 数学期望,方差,标准差,样本方差,协方差,相关系数概念扫盲