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文件,输出视频信息和总帧数。相关推荐

  1. Ubuntu 下使用go语言调用ffmpeg推流

    Ubuntu 下使用go语言调用ffmpeg推流Ubuntu 下使用go语言调用ffmpeg推流 win10 安装 Ubuntu Windows Subsystem for Linux(WSL)适用于 ...

  2. C++调用ffmpeg批量合并bilibili缓存视频

    文章目录 前言 一.先看效果 二.开始写代码 1.遍历文件 2.获取视频标题和视频名称 3.生成视频 4.主函数 总结 前言 手机bilibili缓存了很多视频,想导入电脑看,但发现缓存的视频被分割成 ...

  3. C#调用FFMPEG,并异步读取输出信息的代码

    public void ConvertVideo() { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = @"c:\f ...

  4. 信息学奥赛训练体系(2023.02.21)

    信息学奥赛寒假.暑假.国庆十一假期 如何进行集训 信息学奥赛寒假.暑假.国庆十一假期 如何进行集训_dllglvzhenfeng的博客-CSDN博客 信息学奥赛 CSP-J2 CSP-S2第2轮 复赛 ...

  5. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  6. Linux下C语言调用paly播放音频文件

    一.安装sox播放器 sox播放器支持流行的多种类型的音频文件 sudo apt-get install sox sudo apt-get install sox libsox-fmt-all 二.在 ...

  7. c语言乘法表只有结果,要求输出结果显示相乘的两数及乘积怎么做?

    1. #include void main() { int i,j; printf("* "); for(i=1;i=10) printf("%d ",i*j) ...

  8. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)【笔记】

    不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...

  9. 题目描述请参照本章例题,编写一个程序,输出以下信息:************************** Very Good**********************

    输入 无需输入 输出 **************************          Very    Good! ************************** 样例输出 ******* ...

最新文章

  1. 【转】卡尔曼滤波算法详细推导(相当值得一看)
  2. 第十三周项目4-数组的排序:冒泡排序
  3. UVa 164 - String Computer
  4. 大工14春《计算机应用基础》在线测试2,大工14春《计算机应用基础》在线测试2...
  5. python读取指定行到最后一行_python读取文件最后一行两种方法
  6. 敏捷开发系列学习总结(17)——团队需要Scrum Master做这六件事
  7. Git正确的协作方式(很简单)
  8. 数据--第28课 - 进阶星移
  9. nanomsg应用中的问题整理
  10. 手机android微信文件怎么恢复,微信文件过期或被清理怎么恢复?好工具,帮你安全快速找回文件!...
  11. UOJ #11.【UTR #1】ydc的大树 题解
  12. 关于《那些年啊,那些事——一个程序员的奋斗史》的更新
  13. 实施化化工厂人员定位系统势在必行,你不知道的化化工厂人员定位
  14. matlab 点顺时针排序,按顺时针顺序对点排序?
  15. pika详解(五)登录认证及connectionParameters
  16. 1月第2周业务风控关注 | 微信打击盗用他人的身份恶意注册,去年处理300多万例
  17. 怎样去查询Unity的API文档
  18. vmware虚拟机修改mac地址
  19. 【测试必备】汉化Postman竟如此简单,秒变中文,真香
  20. 数学期望,方差,标准差,样本方差,协方差,相关系数概念扫盲

热门文章

  1. 3500x架构_3500x和 区别有多大 Ryzen 5 3500x Vs 3600
  2. Python 复制文件的 9 种方法
  3. idea和pycharm注释模板设置
  4. PHP连接数据库学习手册
  5. 我和《窗边的小豆豆》 1
  6. i9 12900HK怎么样?相当于什么级别
  7. LeetCode 79 单词搜索
  8. php 包含字母随机数_php生成随机数 生成随机字符串的5种方法
  9. 转载: 133 行代码实现质感地形
  10. 关于“穿着棉袄洗澡”