安卓開發(fā)要學(xué)多久,安卓開發(fā)如果自學(xué)的話,沒有系統(tǒng)性的學(xué)習(xí),而且缺乏項(xiàng)目經(jīng)驗(yàn)的實(shí)踐是難以真正掌握的。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比達(dá)孜網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式達(dá)孜網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋達(dá)孜地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
培訓(xùn)機(jī)構(gòu)對于安卓開發(fā)的培訓(xùn),一般有4個(gè)月到半年的不等。
安卓開發(fā)要學(xué)多久,學(xué)習(xí)android又需要哪些技能基礎(chǔ)呢。
1、Java基礎(chǔ)知識很多朋友一上手就開始學(xué)習(xí)Android,似乎太著急了一些。
Android應(yīng)用程序開發(fā)是以Java語言為基礎(chǔ)的,所以沒有扎實(shí)的Java基礎(chǔ)知識,只是機(jī)械的照抄別人的代碼,是沒有任何意義的。
萬丈高樓平地而起,Java就是筑起高樓的每一塊磚頭。
那么Java學(xué)到什么程度才算是過關(guān)呢?我個(gè)人認(rèn)為至少要掌握以下兩個(gè)方面的內(nèi)容:a)Java基礎(chǔ)語法:具體的知識點(diǎn)列表可以在這里下載:《Java知識點(diǎn)列表》V1.0。
這部分內(nèi)容沒有討價(jià)還價(jià)的余地,必須爛熟于胸。
至于具體的學(xué)習(xí)方法,可以看書或者是看視頻,但是關(guān)鍵是要多加練習(xí),無論是書上的練習(xí)還是視頻里面的練習(xí),都需要仔仔細(xì)細(xì)的完成;b)設(shè)計(jì)模式:由于在Android系統(tǒng)的框架層當(dāng)中,使用了大量的設(shè)計(jì)模式,如果沒有這個(gè)方面的知識,對于Android的理解就會大打折扣。
設(shè)計(jì)模式的種類非常之多,一個(gè)一個(gè)的全部掌握,是不現(xiàn)實(shí)的,必須首先掌握面向?qū)ο蟮幕A(chǔ)設(shè)計(jì)原則,有了這些基礎(chǔ)原則的支持,就可以舉一反三。
這部分內(nèi)容可以在《EffectiveJava》和《Agile.Software.Development:Principles,Patterns.and.Practices》這兩本書中找到。
2、Linux基礎(chǔ)知識大家都知道,Android系統(tǒng)的基礎(chǔ)是Linux操作系統(tǒng)。
在開發(fā)過程當(dāng)中,我們也需要使用到一些Linux命令。
所以說一些Linux的基礎(chǔ)知識是必須的(話說現(xiàn)在的程序員,不懂Linux都不好意思跟人家打招呼),廣州北大青鳥推薦大家看看北大青鳥相當(dāng)不錯(cuò);3、數(shù)據(jù)庫基礎(chǔ)知識這個(gè)比較簡單,就是一個(gè)增刪改查的數(shù)據(jù)庫操作,可以看一下這本書:《SQL編程練習(xí)與解答》。
4、網(wǎng)絡(luò)協(xié)議至少需要學(xué)習(xí)兩種基礎(chǔ)的協(xié)議,HTTP協(xié)議與Socket協(xié)議;5、Android基礎(chǔ)知識此知識點(diǎn)的篇幅較大,在這里就不作更多解釋了。
一、activity
1.一個(gè)activity就是一個(gè)類,繼承activity;
2.需要復(fù)寫onCreate()方法;
3.每一個(gè)activity都需要在AndroidMainfest.xml清單上進(jìn)行配置;
4.為activity添加必要的控件。
二、布局
線性布局:LinearLayout
1.填滿父空間:fill_parent、match_parent
2.文本多大空間就有多大:warp_content
3.文字對齊方式:gravity
4.占屏幕的比例:layout_weight="1" ?水平方向,則width=0,垂直方向,則height=0
5.一行顯示,空間不夠會省略:singleLine="ture"? false會換行
6.背景:background="#ffffff"
7.水平布局:orientation="horizontal"
垂直布局:orientation="vertivcal"
表格布局:TableLayout
1.內(nèi)邊距:padding
2.外邊距:marginLeft\Start、Right\End、Top、Bottom
三、RelativeLayout相對布局
layout_above 將該控件的底部置于給定ID控件之上
layout_below 將該控件的頂部置于給定ID控件之下
layout_toLeftOf 將該控件的右邊緣和給定ID控件的左邊緣對齊
layout_toRightOf 將該控件的左邊緣和給定ID控件的右邊緣對齊
layout_alignBaseline 該控件的baseline和給定ID的控件的Baseline對齊
layout_alignBottom 該控件的底部邊緣和給定ID的控件的底部邊緣對齊
layout_alignLeft 該控件的左邊緣和給定ID的控件的左邊緣對齊
layout_alignRight 該控件的右邊緣和給定ID的控件的右邊緣對齊
layout_alignTop 該控件的頂部邊緣和給定ID的控件的頂部邊緣對齊
layout_alignparentBottom 如果該值為true,則該控件的底部和父控件的底部對齊layout_alignParentLeft 如果該值為true,則該控件的左邊和父控件的左邊對齊
layout_alignParentRight 如果該值為true,則該控件的右邊和父控件的右邊對齊
layout_alignParentTop 如果該值為true,則該控件的上邊和父控件的上邊對齊
layout_centerHorizontal 如果該值為true,則該控件將被置于水平方向的中央
layout_centerInParent 如果該值為true,則該控件將被置于父控件水平和垂直方向的中央
layout_centerVertival 如果該值為true,則該控件將被置于垂直方向的中央
四、一個(gè)Intent對象包含一組信息
1.Component name
2.Action
3.Data
4.Category
5.Extras
6.Flags
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);? //startActivity方法
intent.putExtra("Key", "Value");? //鍵值對
intent = getIntent();
String value = intent.getStringExtra("Key");? ? //通過鍵提取數(shù)據(jù)
五、初級控件:EditText、TextView、Button
1.獲取EditText的值
String value = EditText.getText().toString();
2.將值放到Intent對象中
Intent intent = new Intent();
intent.putExtra("one",value )
intent.setCalss(Activity.this, OtherActivity.class);
3.使用這個(gè)Intent對象來啟動(dòng)Otheractivity
Activity.this.startActivity(intent);
4.將監(jiān)聽器的對象綁定到按鈕對象上
button.setOnclickListener(new Listener());
5.得到Intent對象當(dāng)中的值
Intent intent = getIntent();
String value1 = intent.getStringExtra("one");
int value2 = Integer.parseInt(value);
六、其他初級控件使用
①ImageView
②RadioGroup和RadioButton
setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())
③Checkbox
setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())
④Menu
1.當(dāng)客戶點(diǎn)擊MENU按鈕的時(shí)候,調(diào)用onCreateOptionMenu()方法
public boolean onCreateOptionMenu(Menu menu){
menu.add(0,1,1,R.string.id);
}
2.當(dāng)客戶點(diǎn)擊MENU內(nèi)部的具體某一個(gè)選項(xiàng)時(shí),調(diào)用onOptionItemSelected()方法
public boolean onOptionItemSelected(MenuItem item){
if(item.getItemId() == 1){
finish();
}
return super.onOptionItemSelected(item);
}
七、Activity的生命周期
1.第一次創(chuàng)建時(shí)調(diào)用
protected void onCreat(Bundle saveInstanceState);
2.顯示出來時(shí)調(diào)用
protected void onStrat();
3.獲得用戶焦點(diǎn)時(shí)調(diào)用(可操作)
protected void onResume();
4.點(diǎn)擊彈出第二個(gè)Activity時(shí)調(diào)用
protected void onPause();
5.當(dāng)?shù)谝粋€(gè)Activity不可見時(shí)調(diào)用
protected void onStop();
6.當(dāng)返回第一個(gè)Activity時(shí)調(diào)用,代替OnCreate,因?yàn)闆]被銷毀
protected void onRestart();
7.當(dāng)返回第一個(gè)Activity時(shí)調(diào)用(先執(zhí)行onStop,在執(zhí)行,因?yàn)榈诙€(gè)Activity被銷毀,不能返回獲取,只能通過onCreat,onStart,onResume再創(chuàng)建)
protected void onDestory();
八、Task
1.Task是存放Activity的Stack棧。當(dāng)點(diǎn)擊啟動(dòng)第二個(gè)Activiry時(shí),第一個(gè)Activtiy會被壓入Stack棧當(dāng)中,第二個(gè)Activity會位于棧的頂部;當(dāng)返回第一個(gè)Activtiy時(shí),第二個(gè)Activity會被彈出Stack,第一個(gè)Activity會位于棧的頂部,以此類推。
注釋:當(dāng)調(diào)用finish()時(shí),當(dāng)前的Activity會被Destory掉,棧中的Activity會消失。
2.當(dāng)Activity都從Stack退出后,則就不存在Task。
九、高級控件
①進(jìn)度條ProgressBar
水平進(jìn)度條style="?android:attr/progressBarStyleHorizontal"
圓圈進(jìn)度條style="?android:attr/progressBarStyle"
用戶可視的visibility="gone"
②列表ListView
十、其他控件
A.下拉菜單Spinner
1.創(chuàng)建一個(gè)ArrayAdapter:
ArrayAdapterCharSequence adapter = ArrayAdapter.createFromResource(
this, //指上下文對象
R.array.plant_array, //引用了在文件中定義的String數(shù)組
android.R.layout.simple_spinner_item);//用來指定Spinner的樣式,可替換自定義
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);//設(shè)置Spinner當(dāng)中每個(gè)條目的樣式
2.得到Spinner對象,并設(shè)置數(shù)據(jù):
spinner=(spinner)findViewById(R.id.spinnerId);
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標(biāo)題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個(gè)列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
注:第二種動(dòng)態(tài)設(shè)計(jì)
1.創(chuàng)建ArrayList對象
ListString list = new ArrayListString();
list.add("test1");
2. 調(diào)用方法
ArrayAdapter adapter = new ArrayAdapter(
this, //指上下文對象
R.layout.item, //引用了指定了下拉菜單的自定義布局文件
R.id.textViewId,//id
list);//數(shù)據(jù)
3.得到Spinner對象,并設(shè)置對象
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標(biāo)題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個(gè)列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
B.DatePicker和DatePickerDialog
1.聲明一個(gè)監(jiān)聽器,使用匿名內(nèi)部類
DatePickerDialog.OnDateSetListener onDateSetListener
= new DatePivkerDialog.OnDateSetListener(){
public void onDateSet(
DatePicker view,
int year,
int monthOfYear,
int dayOfMonth){
S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)
}
}
2.復(fù)寫onCreateDialog(int id)方法:
@override
protected Dialog onCreateDialog(int id){
switch(id){
case DATE_PICKER_ID:
return new DatePickerDialog(this,onDateSetListener,2019,11,25);
}
return null;
}
3.使用時(shí)調(diào)用showDialog()方法
showDialog(DATE_PICKER_ID);
C.AutoCompleteTextView
B.Widget
C.Animatin
十一、實(shí)現(xiàn)ContentProvider過程
1.定義一個(gè)CONTENT_URI常量
2.定義一個(gè)類,繼承ContentProvider
3.實(shí)現(xiàn)query、insert、update、delete、getType和onCreate方法
4.在AndroidManifest.xml當(dāng)中進(jìn)行聲明
幀,是視頻的一個(gè)基本概念,表示一張畫面,如上面的翻頁動(dòng)畫書中的一頁,就是一幀。一個(gè)視頻就是由許許多多幀組成的。
幀率,即單位時(shí)間內(nèi)幀的數(shù)量,單位為:幀/秒 或fps(frames per second)。一秒內(nèi)包含多少張圖片,圖片越多,畫面越順滑,過渡越自然。 幀率的一般以下幾個(gè)典型值:
24/25 fps:1秒 24/25 幀,一般的電影幀率。
30/60 fps:1秒 30/60 幀,游戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。
85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義。
這里我們只講常用到的兩種色彩空間。
RGB的顏色模式應(yīng)該是我們最熟悉的一種,在現(xiàn)在的電子設(shè)備中應(yīng)用廣泛。通過R G B三種基礎(chǔ)色,可以混合出所有的顏色。
這里著重講一下YUV,這種色彩空間并不是我們熟悉的。這是一種亮度與色度分離的色彩格式。
早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以后,加入了UV兩種色度,形成現(xiàn)在的YUV,也叫YCbCr。
Y:亮度,就是灰度值。除了表示亮度信號外,還含有較多的綠色通道量。
U:藍(lán)色通道與亮度的差值。
V:紅色通道與亮度的差值。
音頻數(shù)據(jù)的承載方式最常用的是 脈沖編碼調(diào)制 ,即 PCM 。
在自然界中,聲音是連續(xù)不斷的,是一種模擬信號,那怎樣才能把聲音保存下來呢?那就是把聲音數(shù)字化,即轉(zhuǎn)換為數(shù)字信號。
我們知道聲音是一種波,有自己的振幅和頻率,那么要保存聲音,就要保存聲音在各個(gè)時(shí)間點(diǎn)上的振幅。
而數(shù)字信號并不能連續(xù)保存所有時(shí)間點(diǎn)的振幅,事實(shí)上,并不需要保存連續(xù)的信號,就可以還原到人耳可接受的聲音。
根據(jù)奈奎斯特采樣定理:為了不失真地恢復(fù)模擬信號,采樣頻率應(yīng)該不小于模擬信號頻譜中最高頻率的2倍。
根據(jù)以上分析,PCM的采集步驟分為以下步驟:
采樣率,即采樣的頻率。
上面提到,采樣率要大于原聲波頻率的2倍,人耳能聽到的最高頻率為20kHz,所以為了滿足人耳的聽覺要求,采樣率至少為40kHz,通常為44.1kHz,更高的通常為48kHz。
采樣位數(shù),涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續(xù)的樣本值,而在數(shù)字信號中,信號一般是不連續(xù)的,所以模擬信號量化以后,只能取一個(gè)近似的整數(shù)值,為了記錄這些振幅值,采樣器會采用一個(gè)固定的位數(shù)來記錄這些振幅值,通常有8位、16位、32位。
位數(shù)越多,記錄的值越準(zhǔn)確,還原度越高。
最后就是編碼了。由于數(shù)字信號是由0,1組成的,因此,需要將幅度值轉(zhuǎn)換為一系列0和1進(jìn)行存儲,也就是編碼,最后得到的數(shù)據(jù)就是數(shù)字信號:一串0和1組成的數(shù)據(jù)。
整個(gè)過程如下:
聲道數(shù),是指支持能不同發(fā)聲(注意是不同聲音)的音響的個(gè)數(shù)。 單聲道:1個(gè)聲道
雙聲道:2個(gè)聲道
立體聲道:默認(rèn)為2個(gè)聲道
立體聲道(4聲道):4個(gè)聲道
碼率,是指一個(gè)數(shù)據(jù)流中每秒鐘能通過的信息量,單位bps(bit per second)
碼率 = 采樣率 * 采樣位數(shù) * 聲道數(shù)
這里的編碼和上面音頻中提到的編碼不是同個(gè)概念,而是指壓縮編碼。
我們知道,在計(jì)算機(jī)的世界中,一切都是0和1組成的,音頻和視頻數(shù)據(jù)也不例外。由于音視頻的數(shù)據(jù)量龐大,如果按照裸流數(shù)據(jù)存儲的話,那將需要耗費(fèi)非常大的存儲空間,也不利于傳送。而音視頻中,其實(shí)包含了大量0和1的重復(fù)數(shù)據(jù),因此可以通過一定的算法來壓縮這些0和1的數(shù)據(jù)。
特別在視頻中,由于畫面是逐漸過渡的,因此整個(gè)視頻中,包含了大量畫面/像素的重復(fù),這正好提供了非常大的壓縮空間。
因此,編碼可以大大減小音視頻數(shù)據(jù)的大小,讓音視頻更容易存儲和傳送。
視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應(yīng)時(shí)代發(fā)展而出現(xiàn)的。
其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯(lián)盟主導(dǎo)
MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導(dǎo)。
當(dāng)然,他們也有聯(lián)合制定的編碼標(biāo)準(zhǔn),那就是現(xiàn)在主流的編碼格式H264,當(dāng)然還有下一代更先進(jìn)的壓縮編碼標(biāo)準(zhǔn)H265。
H264是目前最主流的視頻編碼標(biāo)準(zhǔn),所以我們后續(xù)的文章中主要以該編碼格式為基準(zhǔn)。
H264由ITU和MPEG共同定制,屬于MPEG-4第十部分內(nèi)容。
我們已經(jīng)知道,視頻是由一幀一幀畫面構(gòu)成的,但是在視頻的數(shù)據(jù)中,并不是真正按照一幀一幀原始數(shù)據(jù)保存下來的(如果這樣,壓縮編碼就沒有意義了)。
H264會根據(jù)一段時(shí)間內(nèi),畫面的變化情況,選取一幀畫面作為完整編碼,下一幀只記錄與上一幀完整數(shù)據(jù)的差別,是一個(gè)動(dòng)態(tài)壓縮的過程。
在H264中,三種類型的幀數(shù)據(jù)分別為
I幀:幀內(nèi)編碼幀。就是一個(gè)完整幀。
P幀:前向預(yù)測編碼幀。是一個(gè)非完整幀,通過參考前面的I幀或P幀生成。
B幀:雙向預(yù)測內(nèi)插編碼幀。參考前后圖像幀編碼生成。B幀依賴其前最近的一個(gè)I幀或P幀及其后最近的一個(gè)P幀。
全稱:Group of picture。指一組變化不大的視頻幀。
GOP的第一幀成為關(guān)鍵幀:IDR
IDR都是I幀,可以防止一幀解碼出錯(cuò),導(dǎo)致后面所有幀解碼出錯(cuò)的問題。當(dāng)解碼器在解碼到IDR的時(shí)候,會將之前的參考幀清空,重新開始一個(gè)新的序列,這樣,即便前面一幀解碼出現(xiàn)重大錯(cuò)誤,也不會蔓延到后面的數(shù)據(jù)中。
DTS全稱:Decoding Time Stamp。標(biāo)示讀入內(nèi)存中數(shù)據(jù)流在什么時(shí)候開始送入解碼器中進(jìn)行解碼。也就是解碼順序的時(shí)間戳。
PTS全稱:Presentation Time Stamp。用于標(biāo)示解碼后的視頻幀什么時(shí)候被顯示出來。
前面我們介紹了RGB和YUV兩種圖像色彩空間。H264采用的是YUV。
YUV存儲方式分為兩大類:planar 和 packed。
planar如下:
packed如下:
上面說過,由于人眼對色度敏感度低,所以可以通過省略一些色度信息,即亮度共用一些色度信息,進(jìn)而節(jié)省存儲空間。因此,planar又區(qū)分了以下幾種格式:YUV444、 YUV422、YUV420。
YUV 4:4:4采樣,每一個(gè)Y對應(yīng)一組UV分量。
YUV 4:2:2采樣,每兩個(gè)Y共用一組UV分量。
YUV 4:2:0采樣,每四個(gè)Y共用一組UV分量。
其中,最常用的就是YUV420。
YUV420屬于planar存儲方式,但是又分兩種類型:
YUV420P:三平面存儲。數(shù)據(jù)組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。
YUV420SP:兩平面存儲。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)
原始的PCM音頻數(shù)據(jù)也是非常大的數(shù)據(jù)量,因此也需要對其進(jìn)行壓縮編碼。
和視頻編碼一樣,音頻也有許多的編碼格式,如:WAV、MP3、WMA、APE、FLAC等等,音樂發(fā)燒友應(yīng)該對這些格式非常熟悉,特別是后兩種無損壓縮格式。
但是,我們今天的主角不是他們,而是另外一個(gè)叫AAC的壓縮格式。
AAC是新一代的音頻有損壓縮技術(shù),一種高壓縮比的音頻壓縮算法。在MP4視頻中的音頻數(shù)據(jù),大多數(shù)時(shí)候都是采用AAC壓縮格式。
AAC格式主要分為兩種:ADIF、ADTS。
ADIF:Audio Data Interchange Format。音頻數(shù)據(jù)交換格式。這種格式的特征是可以確定的找到這個(gè)音頻數(shù)據(jù)的開始,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼,即它的解碼必須在明確定義的開始處進(jìn)行。這種格式常用在磁盤文件中。
ADTS:Audio Data Transport Stream。音頻數(shù)據(jù)傳輸流。這種格式的特征是它是一個(gè)有同步字的比特流,解碼可以在這個(gè)流中任何位置開始。它的特征類似于mp3數(shù)據(jù)流格式。
ADIF數(shù)據(jù)格式:
ADTS 一幀 數(shù)據(jù)格式(中間部分,左右省略號為前后數(shù)據(jù)幀):
AAC內(nèi)部結(jié)構(gòu)也不再贅述,可以參考AAC 文件解析及解碼流程
細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時(shí)使用到的視頻格式,比如:mp4、rmvb、avi、mkv、mov...
沒錯(cuò),這些我們熟悉的視頻格式,其實(shí)是包裹了音視頻編碼數(shù)據(jù)的容器,用來把以特定編碼標(biāo)準(zhǔn)編碼的視頻流和音頻流混在一起,成為一個(gè)文件。
例如:mp4支持H264、H265等視頻編碼和AAC、MP3等音頻編碼。
我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇,但是我們大部分時(shí)候并不能感覺出他們的區(qū)別,對于普通用戶來說,只要能播放就行了。
那么他們內(nèi)部究竟有什么區(qū)別呢?
在手機(jī)或者PC上,都會有CPU、GPU或者解碼器等硬件。通常,我們的計(jì)算都是在CPU上進(jìn)行的,也就是我們軟件的執(zhí)行芯片,而GPU主要負(fù)責(zé)畫面的顯示(是一種硬件加速)。
所謂軟解碼,就是指利用CPU的計(jì)算能力來解碼,通常如果CPU的能力不是很強(qiáng)的時(shí)候,一則解碼速度會比較慢,二則手機(jī)可能出現(xiàn)發(fā)熱現(xiàn)象。但是,由于使用統(tǒng)一的算法,兼容性會很好。
硬解碼,指的是利用手機(jī)上專門的解碼芯片來加速解碼。通常硬解碼的解碼速度會快很多,但是由于硬解碼由各個(gè)廠家實(shí)現(xiàn),質(zhì)量參差不齊,非常容易出現(xiàn)兼容性問題。
MediaCodec 是Android 4.1(api 16)版本引入的編解碼接口,是所有想在Android上開發(fā)音視頻的開發(fā)人員繞不開的坑。
由于Android碎片化嚴(yán)重,雖然經(jīng)過多年的發(fā)展,Android硬解已經(jīng)有了很大改觀,但實(shí)際上各個(gè)廠家實(shí)現(xiàn)不同, 還是會有一些意想不到的坑。
相對于FFmpeg,Android原生硬解碼還是相對容易入門一些,所以接下來,我將會從MediaCodec入手,講解如何實(shí)現(xiàn)視頻的編解碼,以及引入OpenGL實(shí)現(xiàn)對視頻的編輯,最后才引入FFmpeg來實(shí)現(xiàn)軟解,算是一個(gè)比較常規(guī)的音視頻開發(fā)入門流程吧。
安卓開發(fā)要學(xué)什么?
1.熟悉java編程語言,android應(yīng)用程序開發(fā)是以java語言為基礎(chǔ)的,所以沒有扎實(shí)的java基礎(chǔ)知識,如果只是簡單機(jī)械的照抄照搬別人的代碼,是沒有任何意義的。
2.具備一定的數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)知識,如果明白這些可以很清楚的明白到底應(yīng)該選擇哪個(gè)數(shù)據(jù)結(jié)構(gòu)或者是算法,掌握這一方面的基礎(chǔ)知識,也可以很好地為后續(xù)的學(xué)習(xí)做鋪墊。
3.需要掌握一些Linux操作系統(tǒng),在開發(fā)過程中,我們會需要使用到一些Linux命令,所以說Linux的基礎(chǔ)知識也是必備的。
這些基礎(chǔ)的安卓開發(fā)要學(xué)的內(nèi)容,作為安卓開發(fā)工程師必須掌握這些扎實(shí)的概念基礎(chǔ)和技術(shù)技能必須掌握。
安卓開發(fā)需要哪些基礎(chǔ)知識呢?
1.java基礎(chǔ)知識,在android系統(tǒng)的框架當(dāng)中,會使用大量的設(shè)計(jì)模式,所以掌握這些基礎(chǔ)的設(shè)計(jì)原則,可以在學(xué)習(xí)過程中舉一反三,更好地利用所學(xué)內(nèi)容。
2.Linux基礎(chǔ)知識,android系統(tǒng)的基礎(chǔ)是Linux操作系統(tǒng),所以在開發(fā)過程中,我們可以使用一些Linux命令。
3.數(shù)據(jù)庫基礎(chǔ)知識,這部分知識點(diǎn)相對來講比較簡單,簡單的說就是增刪改查數(shù)據(jù)庫的操作。
4.網(wǎng)絡(luò)協(xié)議,http協(xié)議和socket協(xié)議這兩種基礎(chǔ)的協(xié)議是需要掌握的。
5.android基礎(chǔ)知識
6.服務(wù)器端的開發(fā)知識,很多android應(yīng)用程序都需要服務(wù)器端的支持,所以掌握一些服務(wù)器的開發(fā)知識是很有必要的…… JAVA EE、PHP、.NET和ruby on rails這么多的類型,至于要選擇哪一種服務(wù)器端知識進(jìn)行學(xué)習(xí),這樣就會比較麻煩,畢竟技術(shù)的種類確實(shí)是很多。
當(dāng)前標(biāo)題:android知識,android知識體系結(jié)構(gòu)
標(biāo)題URL:http://chinadenli.net/article15/dsichgi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站策劃、全網(wǎng)營銷推廣、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營銷、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)