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());
}
转载于:https://www.cnblogs.com/liunx1109/p/9270528.html
FFmpeg编写的代码相关推荐
- 如何用FFmpeg编写一个简单播放器详细步骤介绍
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...
- ffmpeg mplayer x264 代码重点详解 详细分析
ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((a+b+1)>>1) #define avg4 ...
- 第1课第4.4节_Android硬件访问服务编写HAL代码
android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET http://blog.csdn.net/ab198604/article/details/51249303 And ...
- html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...
html5编写网页代码 freeCodeCamp went live in October 2014. In the five years since, we've done quite a bit. ...
- java培训教程分享:Java编写软件代码自动提示功能
本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...
- 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是
多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...
- 编写优质代码的 6 大关键方法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习实验室 [译者注]作为一名开发者,编写一手干净的 ...
- 如何优雅的编写 JavaScript 代码
几乎每个大一点公司都有一个"运行时间长,维护的工程师换了一批又一批"的项目,如果参与到这样的项目中来,大部分人只有一个感觉--"climb the shit mounta ...
- 你解决的问题比你编写的代码更重要!
软件的目的有时会被遗忘 程序员似乎忘记了软件的真正目的,那就是解决现实问题. 50年前,在1968年,由北约科学委员会主办的软件工程工作会议召开.那时,人们开始注意到软件正在成为社会的基本组成部分.然 ...
- java代码如何与界面联系在一起_如何在Visual Studio Code 中编写Java代码
本文将展示如何在Visual Studio Code中用Java编写和运行一个简单的Hello World程序. 首先您必须在本地开发环境中安装Java SE开发工具包(JDK) Visual Stu ...
最新文章
- 修改Android设备在Windows设备管理器出现的设备名称
- WIKI 开发工具网站收藏
- 新手入门深度学习 | 3-1:数据管道Dataset
- SQL Server 2005无法输入中文的解决方案
- 注册注解BeanDefinition
- 删除数据表和清空数据表的内容(保存表结构)的SHELL脚本
- [html] html的哪个标签可以预渲染?
- 关于SDN的未来,Linux基金会专访阿里云网络大神
- java构造方法赋值内存图_java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念...
- 小米真香产品被友商怼:只有USB2.0接口 怎么播高码率的视频?
- python之求字典最值
- 解决/usr/bin/ld: cannot find -lxxx 问题
- python二元函数拟合_Python拟合二元一次函数
- 在Centos7下捣鼓邮件发送软件sendmail与postfix
- Java:String类学习笔记
- 被开发者和合作商抛弃 Android难现昨日辉煌
- Hyper-V 2016 系列教程30 机房温度远程监控方案
- 中外法律文献查找下载常用数据库大盘点
- 盛姓取名女孩儒雅大气
- Poj·Dessert
热门文章
- 19. 删除链表的倒数第N个节点【双指针经典应用】详解
- Ps 初学者教程,如何使用色阶滴管工具校正色偏?
- Sensei for Mac(系统优化清理工具)
- 利用zabbix监控ogg进程(Windows平台下)
- Vue Element校验validate
- 日本定了一个小目标,在2030年让五分之一的汽车实现自动驾驶
- JQUERY-SELECT 实现下拉框可以搜索、选择
- Check Point截获JavaScript文件隐形攻击
- centos最新版solr5.3.1安装和数据整理以及遇到的问题解答
- ubuntu 上搭建lanp环境