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 main

import (
"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.AVFormatContext
var pkt *libavcodec.AVPacket
var codecCtx *libavcodec.AVCodecContext
var avCodecPara *libavcodec.AVCodecParameters
var codec *libavcodec.AVCodec
libavformat.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)).Codecpar
codec = 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() //分配一个packet
pkt.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. [转]C#调用FFMPEG,并异步读取输出信息的代码

    http://www.cnblogs.com/Leo_wl/archive/2011/12/31/2308841.html

  2. 第九次第十次作业 网页设计HTML语言之mp3 与mp4音频与视频两次作业,功能在一起也可

    参考的网址是: MP3 参考http://www.cnblogs.com/qingyundian/p/7831098.html MP4参考 http://www.cnblogs.com/qingyun ...

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

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

  4. C语言之基本算法38—格式化输出10000以内的全部完数

    //穷举法! /* ================================================================== 题目:求10000以内的全部完数,统计数量并以 ...

  5. NET 2.0(C#)调用ffmpeg处理视频的方法

    另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...

  6. python调用mediainfo工具批量提取视频信息

    写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...

  7. C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成软件

    C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成 1,调用ffmpeg将外挂字幕“嵌入”视频中,保存副本: 2,调用ffmpeg将副本视频导出为gif图片. 参考资料 ...

  8. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  9. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  10. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...

随机推荐

  1. bat将多个文件夹下内容合并到一个文件夹下

    for /f "delims=" %%p in ('dir /b/ad') do copy %%p\*.* d:\all\ pause 目标文件夹 d:\all\ 最好不用中文目录

  2. week4题解

    1.深度优先搜索 思路:以固定的移动顺序走迷宫,若能到终点则记一次 到终点后回溯到前一个有分岔的地方,走另一条路线 若走到死路也同样回溯到前一个有分叉的地方. 最终遍历所有路线 #include &l ...

  3. ReentrantLock源码阅读

    默认构造方法初始化同步器为非公平同步器 /** * Creates an instance of {@code ReentrantLock}. * This is equivalent to usin ...

  4. 操作kubernets(k8s)的增删改查

    资源的CRUD: 创建: Service service = client.services().inNamespace(namespace).create(service); 更新: Namespa ...

  5. Python学习笔记--SQL数据

    SQL 本人受到Java的影响,数据库的话,就不按照教程走了,我就直接使用的是Navicat软件的数据库啦! SQL支持注释: 两种单行注释(-- 和# ),和一种多行注释(/* */) 基础的使用语 ...

  6. 关于IDEA发出基于APR的本地库加载失败错误的解决------->求解决!

    问题描述 在没有使用Maven项目启动该Project时,Tomcat可以正常使用,但在这里会显示这样的错误: 这个错误,已经查了两天了,相关文件以及解决方法已经翻烂了,还没有解决,放出来集思广益一下 ...

  7. 【LeetCode2180】[Go/C++/C#/Ruby/Swift/Kotlin/Rust/PHP/TS/Racket/Dart/Java/Elixir/Scala/Erlang] 统计各位数字之和为偶数的整数个数

    目录 题解地址 代码 golang c++ C# ruby swift kotlin rust php typescript racket dart java elixir scala erlang ...

  8. python + BeautifulSoup + selenium 实现爬取中医智库的古籍分类的数据

    爬取内容为 该图片下的七个分类, 然后对应的每个种类的书本信息(摘要和目录) 效果为 代码如下 import requests from bs4 import BeautifulSoup import ...

  9. 自己动手从零写桌面操作系统GrapeOS系列教程——23.从硬盘读取文件

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 本讲代码文件为boot.asm,要读取的文件为data.txt. 一.在FAT16系统中读取文件的流程 在GrapeOS中用到的文件少且小,所有 ...

  10. kubernetes 设置 Master 可调度与不可调度

    kubernetes 设置 Master 可调度与不可调度 语法 kubectl taint node [node] key=value[effect] [effect] 可取值: [ NoSched ...