当前位置:首页 » 安卓系统 » android的接口

android的接口

发布时间: 2022-12-28 08:42:23

‘壹’ Android原生编解码接口 MediaCodec 之——完全解析

MediaCodec 是Android 4.1(api 16)版本引入的编解码接口, Developer 官网 上描述的已经很清楚了。可以配合 中文翻译 一起看。理解更深刻。

MediaCodec的工作流程:

从上图可以看出 MediaCodec 架构上采用了2个缓冲区队列,异步处理数据,并且使用了一组输入输出缓存
你请求或接收到一个空的输入缓存(input buffer),向其中填充满数据并将它传递给编解码器处理。编解码器处理完这些数据并将处理结果输出至一个空的输出缓存(output buffer)中。最终,你请求或接收到一个填充了结果数据的输出缓存(output buffer),使用完其中的数据,并将其释放给编解码器再次使用。
具体工作如下:

MediaCodec的基本调用流程是:

1.初始化MediaCodec,方法有两种,分别是通过名称和类型来创建,对应的方法为:

2.配置编码器,设置各种编码器参数(MediaFormat),这个类包含了比特率、帧率、关键帧间隔时间等。然后再调用 mMediaCodec .configure,对于 API 19 以上的系统,我们可以选择 Surface 输入:mMediaCodec .createInputSurface,

3.打开编码器,获取输入输出缓冲区

获取输入输出缓冲区在api19 上是以上方式获取,api21以后 可以使用直接获取ByteBuffer

4.输入数据,有2种方式,一种是普通输入,一种是Surface 输入
普通输入又可区分为两种情况,一种是配合MediaExtractor ,一种是取原数据;

返回一个填充了有效数据的input buffer的索引,如果没有可用的buffer则返回-1,参数为超时时间(TIMES_OUT),单位是微秒,当timeoutUs==0时,该方法立即返回;当timeoutUs<0时,无限期地等待一个可用的input buffer,当timeoutUs>0时,
等待时间为传入的微秒值。

上面输入缓存的index,通过getInputBuffers()得到的是输入缓存数组,通过index和输入缓存数组可以得到当前请求的输入缓存,在使用之前要clear一下,避免之前的缓存数据影响当前数据,接着就是把数据添加到输入缓存中,并调用queueInputBuffer(...)把缓存数据入队;

5.输出数据
通常编码传输时每个关键帧头部都需要带上编码配置数据(PPS,SPS),但 MediaCodec 会在首次输出时专门输出编码配置数据,后面的关键帧里是不携带这些数据的,所以需要我们手动做一个拼接;

6.使用完MediaCodec后释放资源
要告知编码器我们要结束编码,Surface 输入的话调用 mMediaCodec .signalEndOfInputStream,普通输入则可以为在 queueInputBuffer 时指定 MediaCodec.BUFFER_FLAG_END_OF_STREAM 这个 flag;告知编码器后我们就可以等到编码器输出的 buffer 带着 MediaCodec.BUFFER_FLAG_END_OF_STREAM 这个 flag 了,等到之后我们调用 mMediaCodec .release 销毁编码器

流控就是流量控制。 为什么要控制,就是为了在一定的限制条件下,收益最大化!
涉及到了 TCP 和视频编码:
对 TCP 来说就是控制单位时间内发送数据包的数据量,对编码来说就是控制单位时间内输出数据的数据量。

TCP 的限制条件是网络带宽,流控就是在避免造成或者加剧网络拥塞的前提下,尽可能利用网络带宽。带宽够、网络好,我们就加快速度发送数据包,出现了延迟增大、丢包之后,就放慢发包的速度(因为继续高速发包,可能会加剧网络拥塞,反而发得更慢)。

视频编码的限制条件最初是解码器的能力,码率太高就会无法解码,后来随着 codec 的发展,解码能力不再是瓶颈,限制条件变成了传输带宽/文件大小,我们希望在控制数据量的前提下,画面质量尽可能高。
一般编码器都可以设置一个目标码率,但编码器的实际输出码率不会完全符合设置,因为在编码过程中实际可以控制的并不是最终输出的码率,而是编码过程中的一个量化参数(Quantization Parameter,QP),它和码率并没有固定的关系,而是取决于图像内容。 这一点不在这里展开,感兴趣的朋友可以阅读视频压缩编码和音频压缩编码的基本原理。

无论是要发送的 TCP 数据包,还是要编码的图像,都可能出现“尖峰”,也就是短时间内出现较大的数据量。TCP 面对尖峰,可以选择不为所动(尤其是网络已经拥塞的时候),这没有太大的问题,但如果视频编码也对尖峰不为所动,那图像质量就会大打折扣了。如果有几帧数据量特别大,但仍要把码率控制在原来的水平,那势必要损失更多的信息,因此图像失真就会更严重。 这种情况通常的表现是画面出现很多小方块,看上去像是打了马赛克一样,导致画面的局部或者整体看不清楚的情况

配置时指定目标码率和码率控制模式:

码率控制模式有三种:
码率控制模式在 MediaCodecInfo.EncoderCapabilities 类中定义了三种,在 framework 层有另一套名字和它们的值一一对应:

动态调整目标码率:

Android 流控策略选择

下面展示使用MediaExtractor获取数据后,用MediaMuxer重新写成一个MP4文件的简单栗子

‘贰’ 安卓手机的数据线,它的接口的类型是什么

安卓手机的数据线的接口类型有五种,分别是MBUS、FBUS、DKU-5、FLASH和USB数据线,

现在大多数用到的都是USB数据线。关于这五种接口的具体分析如下:

  1. MBUS数据线:

    传输速率低(9.6kbp/s),硬件比较简单,主要适用于维修、解锁类软件;

  2. FBUS数据线:

    传输率较高(115.2kbp/s),主要用于无线上网、铃声、图片、游戏等传输;

  3. DKU-5数据线:

    高速数据传输功能(230kbp/s),数据线构造复杂,制造成本高,但只支持相应功能强大的配套软件和无线高速上网;

  4. FLASH数据线:

    除了具备FBUS功能外,还可以用于维修升级等方面;

  5. USB数据线:

    手机需要有内置MODEM功能,内置U盘功能,视频摄相头功能,这种数据线上传下载文件速度非常快。

‘叁’ 安卓手机数据线接口类型有哪些

1、安卓micro(麦克) usb数据线,现在使用最普遍的一款数据线,基本适用于除苹果手机外的所有安卓手机,充电+数据传输功能。

2、安卓双面micro usb接口数据线,适用于所有的安卓手机,双面可插,即插即用不分正反。

3、安卓type(泰普)-c接口数据线,数据线界的新星,具有快速充电,高速数据传输,不分正反。

(3)android的接口扩展阅读:

合理选购数据线:

一般认为选购数据线最大的关键就是价格,实际上这是最大的误区。刚才就提到了,数据线根据厂家来分就分国产品牌和国产无牌的,国产无牌里面有杂牌的,杂牌的质量差,3根里面就有1根是坏的,弄得客户不停怀疑自己的电脑水平太差,所以说分清楚产品的质量和寻找良好的销售商是关键因素。

比较有实力的销售商一般就是产品质量的保证,他们不想卖出去的数据线都被退货和换货,就算时间精力也要消耗不少。因此金牌销售商都会和有名有信誉的厂家合作,这些厂家一般的故障率为1%,而一些不良厂家的故障率为30%。这就是为何同样型号功能的数据线价格要差2倍的原因了。

‘肆’ 安卓手机充电接口叫什么

一般在上海的手机专卖店就可以买到,看你用的是安卓手机还是苹果手机,接口都是不一样的,有以下几种接口参考,看你的手机是什么类型的接口。

1、Mini USB接口

早期手机最常见的一种接口,这种接口由于防误插性能出众被广泛的应用于当年的手机、MP3、MP4数码相机。

‘伍’ 安卓手机充电接口叫什么

安卓手机充电接口分两种。

一、Micro USB 接口。

这种借口为新兴接口,在最新款的手机上应用较多,华为就是其中之一。

(5)android的接口扩展阅读:

Micro-USB接口优点:

1、Micro-USB连接器比标准USB和Mini-USB连接器更小,节省空间,具有高达10000次的插拔寿命和强度,盲插结构设计。

2、Micro-USB标准支持目前USB的OTG功能,即在没有主机(例如个人电脑)的情况下,便携设备之间可直接实现数据传输,兼容USB1.1 (低速:1.5Mb/s,全速:12Mb/s) 和USB 2.0(高速:60Mb/s),同时提供数据传输和充电,特别适用于高速(HS)或更高速率的数据传输,是连接小型设备(如手机,PDA,数码相机,数码摄像机和便携数字播放器等等)的最佳选择。

3、MICRO USB通用性广,使用方便。

Type-C主要优点:

1、更薄的机身需要更薄的端口,这也是USB-C横空出世的原因之一。USB-C端口长0.83厘米、宽0.26厘米。老式USB端口长1.4厘米、宽0.65厘米已经显得过时。这也意味着USB-C数据线的末端将是标准USB-A型数据线插头尺寸的三分之一。

2、像苹果的Lightning接口一样,USB-C端口正面和反面是相同的。也就是说无论你怎么插入这一端口都是正确的。用户不必担心传统USB端口所带来的正反问题。

参考资料来源:搜狗网络-micro usb

参考资料来源:搜狗网络-USB Type-C接口

‘陆’ 安卓手机充电接口排针名称是什么

名称是:Micro-USB。

‘柒’ 安卓的充电器接口叫什么

安卓手机充电接口叫做Micro USB接口。
全球就曾大规模推动手机充电器标准统一,多国颁布了非强制性法令,手机厂商因此做出改进。
而中国也力推“USB连接线与充电插头分离”,这已被绝大多数厂商接受。数据线与插头分离式的设计已取代传统一体式设计。
虽然使用标准USB接口连接插座和数据线基本得到了广泛认同,但在数据线的另一端,通过何种接口与手机连接,还存在较大分歧。
政协委员提案:希望手机充电插口统一
2007年,全国政协委员、北京大学国际关系学院副院长贾庆国在政协会议上提出提案,希望能将手机充电器的连线插口统一、标准化。今年的两会上,他又提出了这个提案。
他认为,手机充电器插口不一样为用户造成很大不便。一是增加消费者的成本;另一方面也耗费了大量资源,带来环境污染。

苹果充电器与安卓充电器最大的区别就是其接口不同。
1、苹果充电器的充电接口是双面插头,安卓充电器的充电接口是单面插头;
2、苹果充电器只能为苹果手机充电,安卓充电器可以为大部分安卓手机充电;
3、苹果充电器与安卓充电器不能混用,当然安卓充电器最好也是使用本机所带充电器;

‘捌’ Android接口回调总结,以及运用到弹窗PopWindow的Demo实现

最近项目中接触到接口回调,以及Android弹窗PopWindow组件的使用,现在利用学到的知识自己写了一个简单的Demo,练习下在Android下如何运用接口回调,来实现弹窗PopWindow的功能。

1. 定义一个接口:OnSelectItemListener。定义一个方法 void selectItem(String name, int type),作为点击弹窗的每个Item的回调接口。

2. 自定义弹窗类:MyPopupWindow,其布局文件为popup_window.xml。当在MainActivity调用其构造函数创建对象时,同时执行initPopupWindow()函数,给每个Item设置监听器,监听点击Item时,回调接口函数selectItem("Pop Window A", POP_WINDOW_ITEM_1),该函数在MainActivity中实现。

3. 主Activity: MainActivity。其布局文件为一个Button和一个TextView。监听Button,每当点击则弹出PopWindow,呈现三个Item。调用MyPopupWindow类中的方法setOnSelectItemListener(OnSelectItemListener listener),传入OnSelectItemListener 对象作为参数,同时实现回调接口OnSelectItemListener的方法void selectItem(String name, int type)。

主Activity: MainActivity. java

[java] view plain

packagecom.lambdroid.callbacktest2;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

importandroid.widget.Toast;

//联系接口的回调以及PopWindow弹窗的简单使用

 {

privateMyPopupWindow myPopupWindow;

privateButton btn_pop_window;

privateTextView tv_display;

protectedContext context;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

context =this;

btn_pop_window = (Button) findViewById(R.id.btn_pop_window);

tv_display = (TextView) findViewById(R.id.tv_display);

//给Button设置事件监听:弹出弹窗

btn_pop_window.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(View v) {

myPopupWindow.show(btn_pop_window);

}

});

myPopupWindow =newMyPopupWindow(context);

//实现OnSelectItemListener接口的selectItem方法:对于弹窗三个Item的事件监听

myPopupWindow.setOnSelectItemListener(newOnSelectItemListener() {

@Override

publicvoidselectItem(String name,inttype) {

//点击电站列表,弹出弹框

if(myPopupWindow !=null&& myPopupWindow.isShowing()) {

myPopupWindow.dismiss();

}

tv_display.setText(name);

switch(type){

caseMyPopupWindow.POP_WINDOW_ITEM_1:

Toast.makeText(context,"我是弹窗A, 我的英文名是"+ name, Toast.LENGTH_SHORT).show();

break;

caseMyPopupWindow.POP_WINDOW_ITEM_2:

Toast.makeText(context,"我是弹窗B, 我的英文名是"+ name, Toast.LENGTH_SHORT).show();

break;

caseMyPopupWindow.POP_WINDOW_ITEM_3:

Toast.makeText(context,"我是弹窗C, 我的英文名是"+ name, Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

});

}

}

activity_main.xml

[html] view plain

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/btn_pop_window"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_margin="20dp"

android:padding="20dp"

android:text="Pop Window"

android:textSize="20sp"/>

android:id="@+id/tv_display"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginTop="10dp"

android:gravity="center"

android:text="Hello World!"

android:textSize="30sp"/>

自定义弹窗类:MyPopupWindow.java

[java] view plain

packagecom.lambdroid.callbacktest2;

importandroid.app.ActionBar;

importandroid.content.Context;

importandroid.graphics.drawable.ColorDrawable;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.widget.LinearLayout;

importandroid.widget.PopupWindow;

.OnClickListener{

privatePopupWindow mPopWindow;

privateContext mContext;

privateLinearLayout llPop1;

privateLinearLayout llPop2;

privateLinearLayout llPop3;

privateintpw_height;

publicstaticfinalintPOP_WINDOW_ITEM_1 =1;

publicstaticfinalintPOP_WINDOW_ITEM_2 =2;

publicstaticfinalintPOP_WINDOW_ITEM_3 =3;

privateOnSelectItemListener listener;

(OnSelectItemListener listener){

this.listener = listener;

}

publicMyPopupWindow(Context context){

mContext = context;

initPopupWindow();//初始化弹窗

}

publicvoidinitPopupWindow(){

View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window,null);

mPopWindow =newPopupWindow(view, ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,true);

mPopWindow.setOutsideTouchable(true);

/** 为其设置背景,使得其内外焦点都可以获得 */

mPopWindow.setBackgroundDrawable(newColorDrawable());

mPopWindow.setFocusable(true);

pw_height = view.getHeight();

llPop1 = (LinearLayout) view.findViewById(R.id.ll_pop_1);

llPop1.setOnClickListener(this);

llPop2 = (LinearLayout) view.findViewById(R.id.ll_pop_2);

llPop2.setOnClickListener(this);

llPop3 = (LinearLayout) view.findViewById(R.id.ll_pop_3);

llPop3.setOnClickListener(this);

}

//监听三个弹窗的点击事件

@Override

publicvoidonClick(View v) {

switch(v.getId()){

caseR.id.ll_pop_1:

if(listener !=null) {

listener.selectItem("Pop Window A", POP_WINDOW_ITEM_1);//回调接口

}

break;

caseR.id.ll_pop_2:

if(listener !=null) {

listener.selectItem("Pop Window B", POP_WINDOW_ITEM_2);

}

break;

caseR.id.ll_pop_3:

if(listener !=null) {

listener.selectItem("Pop Window C", POP_WINDOW_ITEM_1);

}

break;

default:

break;

}

}

//显示弹窗,并设置弹窗基于标题栏的显示位置

publicvoidshow(View view) {

//popupwindow相对view位置x轴偏移量

View viewTemp = mPopWindow.getContentView();

viewTemp.measure(0,0);

intwidth = viewTemp.getMeasuredWidth();

intxOffset = (view.getWidth() - width) /2;

mPopWindow.showAsDropDown(view, xOffset,0);

}

/**

* 退出popupwindow

*/

publicvoiddismiss() {

if(mPopWindow !=null&& mPopWindow.isShowing()) {

mPopWindow.dismiss();

}

}

/**

* popupwindow是否正在显示

*/

publicbooleanisShowing() {

if(mPopWindow !=null) {

returnmPopWindow.isShowing();

}

returnfalse;

}

}

popup_window.xml

[html] view plain

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/ll_alarm_type"

android:layout_width="120dp"

android:layout_height="130dp"

android:orientation="vertical"

android:background="@drawable/popupwindow"

android:paddingBottom="16dp"

android:paddingTop="16dp">

android:id="@+id/ll_pop_1"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_marginTop="5dp"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 A"

android:textSize="15sp"

android:textColor="#ffffff"/>

android:id="@+id/ll_pop_2"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 B"

android:textSize="15sp"

android:textColor="#ffffff"/>

android:id="@+id/ll_pop_3"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 C"

android:textSize="15sp"

android:textColor="#FFFFFF"/>

回调接口:OnSelectItemListener

[java] view plain

packagecom.lambdroid.callbacktest2;

 {

voidselectItem(String name,inttype);

}

点击Button,弹出弹窗,显示三个Item

点击第二个Item,通过回调函数,来实现TextView内容的修改,以及弹出Toast

总结

Java回调情形涉及很多,本文属于接口的异步回调:当不知道何时会执行接口的回调函数,(通过接口回调来对获取到的资源的操作)。除此还有线程间的异步回调(子线程进行耗时操作,操作完毕通知主线程或将数据传给主线程处理),以及利用接口回调来实现线程间的数据通信等等(Android可以利用Handler来实现)。等下次再举例说明Java回调函数的其它情形。

‘玖’ 安卓手机数据线插孔叫什么名字

目前安卓的数据线分为两种

一、早期的MicroUSB,插入手机有正反面区别

如下图所示:

这两种借口都是目前安卓手机常用的接口方式,也是目前魅族手机配备的数据线。

热点内容
移动硬盘和光盘哪个存储时间长 发布:2025-05-15 07:04:25 浏览:488
压缩一定 发布:2025-05-15 06:57:30 浏览:289
进栈算法 发布:2025-05-15 06:56:02 浏览:215
安卓和缓存 发布:2025-05-15 06:56:02 浏览:428
笔记本电脑台式服务器 发布:2025-05-15 06:40:41 浏览:109
4k无压缩 发布:2025-05-15 06:02:54 浏览:75
hp存储6350 发布:2025-05-15 05:40:41 浏览:233
怎么更改电脑默认缓存位置 发布:2025-05-15 05:39:01 浏览:877
安卓qq公孙离在哪个战区战力最低 发布:2025-05-15 05:38:58 浏览:494
androidffmpeg压缩 发布:2025-05-15 05:37:02 浏览:288