FFmpeg编写的代码
//初始化解封装
av_register_all();
avformat_network_init();
avcodec_register_all();
//封装文件的上下文
AVFormatContext *ic = NULL;
char path[] = "sdcard/shape.mp4";
//打开文件并且解析
int re = avformat_open_input(&ic, path, NULL, NULL);
if(re != 0)
{
Logw("avformat_open_input %s failed", av_err2str(re));
return env->NewStringUTF(hello.c_str());
}
Logw("duration = %lld nb_stream = %d", ic->duration , ic->nb_streams);
//找到流的信息
int re1 = avformat_find_stream_info(ic, NULL);
if(re1!=0)
{
Logw("avformat_find_stream_info failed");
}
Logw("duration = %lld nb_stream = %d" , ic->duration , ic->nb_streams);
//找流的信息有两种方案
//1.遍历整个信息
int fps = 0 ;
int wigth = 0;
int height = 0;
int videoStream = 0;
int audioStream = 0;
for (int i = 0; i < ic->nb_streams; i++)
{
AVStream *as = ic->streams[i];
if(as->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
{
Logw("视频数据");
videoStream = i;
fps = r2d(as->avg_frame_rate);
Logw("fps = %d width = %d height = %d codeid = %d" , fps , as->codecpar->width ,
as->codecpar->height , as->codecpar->codec_id);
Logw("tag = %d format = %d" , as->codecpar->codec_tag , as->codecpar->format);
}
else if(as->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
{
Logw("音频数据");
audioStream = i;
Logw("sample_rate = %d channel = %d format = %d" , as->codecpar->sample_rate ,
as->codecpar->channels , as->codecpar->format);
}
}
//av_find_best_stream()来找到对应的流
audioStream = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
Logw("av_find_best_stream audioStream = %d " , audioStream);
Logw("sample_rate = %d channel = %d format = %d" , ic->streams[audioStream]->codecpar->sample_rate ,
ic->streams[audioStream]->codecpar->channels , ic->streams[audioStream]->codecpar->format);
/*****************打开视频解码器*********************************/
//找到软解码器
AVCodec *codec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id);
//找到硬解码器
codec = avcodec_find_decoder_by_name("h264_mediacodec");
//解码器初始化
AVCodecContext *vc = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(vc, ic->streams[videoStream]->codecpar);
vc->thread_count = 4;
//打开解码器
re = avcodec_open2(vc, 0, 0);
if(re != 0)
{
Logw("avcodec open failed");
return env->NewStringUTF(hello.c_str());
}
/*****************打开音频解码器*********************************/
AVCodec *avCodec = avcodec_find_decoder(ic->streams[audioStream]->codecpar->codec_id);
//初始化软解码器
AVCodecContext *av = avcodec_alloc_context3(avCodec);
avcodec_parameters_to_context(av, ic->streams[audioStream]->codecpar);
av->thread_count = 4;
//打开音视频解码器
re = avcodec_open2(av, 0, 0);
if(re != 0)
{
Logw("avcodec open failed");
return env->NewStringUTF(hello.c_str());
}
//读取帧数据
AVPacket *pkt = av_packet_alloc();
AVFrame *frame = av_frame_alloc();
long long start = GetNowMs();
int frameCount = 0;
for(;;)
{
//时间超过3秒
if(GetNowMs() - start >= 3000)
{
Logw("now decodec fps is %d", frameCount / 3);
start = GetNowMs();
frameCount = 0;
}
int re = av_read_frame(ic, pkt);
if(re != 0)
{
Logw("读取到结尾处");
// int pos = 10 * r2d(ic->streams[videoStream]->time_base);
// av_seek_frame(ic, videoStream, pos,
// AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_FRAME);
break;
}
AVCodecContext *cc = vc;
if(pkt->stream_index == audioStream) {
cc = av;
}
//把数据发送到数据缓冲空间去
re = avcodec_send_packet(cc, pkt);
av_packet_unref(pkt);
if(re != 0)
{
Logw("avcodec_send_packet failed");
continue;
}
for(;;)
{
re = avcodec_receive_frame(cc, frame);
if(re != 0)
{
//Logw("avcodec_receive_frame failed");
break;
}
//Logw("avcodec_receive_frame %lld " , frame->pts);
//如果是视频帧
if(cc == vc)
{
frameCount++;
}
}
}
avformat_close_input(&ic);
return env->NewStringUTF(hello.c_str());
}
FFmpeg编写的代码的更多相关文章
- [转]通过Visual Studio为Linux编写C++代码
Build 2016大会上Microsoft首次公布的Visual Studio 2015扩展提供了在VS2015中编写C++代码,随后通过Linux/UNIX计算机进行编译和执行的能力.这种想法非常 ...
- 基于CkEditor实现.net在线开发之路(2)编写C#代码,怎么调用它。
上一章简约的介绍了CkEditor编辑器,可以编辑js逻辑代码,css,html,C#代码,这章我根据实际例子,讲解怎么编写C#代码和怎么调用它. 大家都还记得刚刚接触程序编时的hello Word吧 ...
- 解决VS2012编写JQuery代码不能智能提示的问题(其他js库的代码提示设置估计类似)
VS默认设置下编写jQuery代码是这样的: 解决办法: 1.在项目的"管理NuGet程序包"中安装JQuery: 2.打开:工具 -> 选项 -> 文本编辑器 -&g ...
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
- AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码
AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...
- mvn编写主代码与测试代码
maven编写主代码与测试代码 3.2 编写主代码 项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包.默认情况下,Maven假设项目 ...
- [JS进阶] 编写可维护性代码 (1)
今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...
- Java认证:JavaRunnable线程编写接口代码
Java认证:JavaRunnable线程编写接口代码.JavaRunnable线程如何才能更好的适应目前的编程环境呢?下面我们就看看如何才能更好的进行相关环境.希望下面的文章对大家有所帮助.Java ...
随机推荐
- php Pthread 多线程 (五) 线程同步
有些时候我们不希望线程调用start()后就立刻执行,在处理完我们的业务逻辑后在需要的时候让线程执行. <?php class Sync extends Thread { private $na ...
- JSP页面中的EL表达式介绍
1.什么是EL? Expression Language(表达式语言) 2.EL的功能 替代JSP页面中数据访问时的复杂编码. 3.EL的特点 自动转换类型 使用简单 4.EL表达式的语法 ${EL ...
- Oracle 基础表查询
--查询所有用户表的数据 SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAME' --如果是用该用户登录使用以下语句: SELECT * FROM USER_ ...
- 关于UI设计的一些工作了解
关于UI设计相信大家在刚接触UI的时候都不太了解,我来说说我在一段学习时间后的了解. UI从工作内容上来说分为3大类,即研究工具,研究人与界面的关系,研究人与之相应. UI设计师的职能一个是图形设 ...
- Laravel 认证原理及完全自定义认证
Laravel 默认的 auth 功能已经是很全面了,但是我们也经常会碰到一些需要自定义的一些情况,比如验证的字段和默认的不匹配,比如需要能够同时满足 user name 和 email 认证等等.如 ...
- 记录如何用abd,用电脑输出手机操作信号
0.http://www.wmzhe.com/soft-39913.html 去这里下载最新版的adb.旧版本很多不好使.一定最新的. 1.用豌豆荚装好驱动 2.开启usb调试.具体方法可以百度到 3 ...
- Spring+SpringMVC+mybatis+Quartz整合
Quartz与SpringMVC的整合 简介 Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调 ...
- 2018.08.27 rollcall(非旋treap)
描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...
- svn 创建tag
1. 右键项目(源) 2. 选择复制到哪个路径(创建文件夹选项) 3. 选择哪个版本(源的) 4. 填写备注 5. 结束 使用:import .合并等
- Gridview的RowDataBound事件可以做很多事情
protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) { //如果是绑 ...