赤壁賦
壬戌之秋,七月既望,蘇子與客泛舟游于赤壁之下。清風(fēng)徐來,水波不興。舉酒屬客,誦明月之詩(shī),歌窈窕之章。少焉,月出于東山之上,徘徊于斗牛之間。白露橫江,水光接天。縱一葦之所如,凌萬頃之茫然。浩浩乎如馮虛御風(fēng),而不知其所止;飄飄乎如遺世獨(dú)立,羽化而登仙。
于是飲酒樂甚,扣舷而歌之。歌曰:“桂棹兮蘭槳,擊空明兮溯流光。渺渺兮予懷,望美人兮天一方?!笨陀写刀春嵳撸懈瓒椭?。其聲嗚嗚然,如怨如慕,如泣如訴,余音裊裊,不絕如縷。舞幽壑之潛蛟,泣孤舟之嫠婦。
蘇子愀然,正襟危坐而問客曰:“何為其然也?”客曰:“月明星稀,烏鵲南飛,此非曹孟德之詩(shī)乎?西望夏口,東望武昌,山川相繆,郁乎蒼蒼,此非孟德之困于周郎者乎?方其破荊州,下江陵,順流而東也,舳艫千里,旌旗蔽空,釃酒臨江,橫槊賦詩(shī),固一世之雄也,而今安在哉?況吾與子漁樵于江渚之上,侶魚蝦而友麋鹿,駕一葉之扁舟,舉匏樽以相屬。寄蜉蝣于天地,渺滄海之一粟。哀吾生之須臾,羨長(zhǎng)江之無窮。挾飛仙以遨游,抱明月而長(zhǎng)終。知不可乎驟得,托遺響于悲風(fēng)?!?/p>
蘇子曰:“客亦知夫水與月乎?逝者如斯,而未嘗往也;盈虛者如彼,而卒莫消長(zhǎng)也。蓋將自其變者而觀之,則天地曾不能以一瞬;自其不變者而觀之,則物與我皆無盡也,而又何羨乎!且夫天地之間,物各有主,茍非吾之所有,雖一毫而莫取。惟江上之清風(fēng),與山間之明月,耳得之而為聲,目遇之而成色,取之無禁,用之不竭,是造物者之無盡藏也,而吾與子之所共適?!?/p>
客喜而笑,洗盞更酌。肴核既盡,杯盤狼藉。相與枕藉乎舟中,不知東方之既白。
希望自己努力堅(jiān)持
最近工作方面需要接觸到音視頻方面,然而自己這方面卻是一個(gè)小白,所以決定自己動(dòng)手學(xué)會(huì)這方面的內(nèi)容,看了一下自己需要學(xué)習(xí)的東西太多太多,網(wǎng)上的資料比較零散,一下子陷入了迷茫.直到在網(wǎng)上看到一篇音視頻開發(fā)指南Android 音視頻開發(fā)入門指南,突然感覺自己又有了目標(biāo)和動(dòng)力,所以接下來就按照上面的步驟一步步進(jìn)階!
進(jìn)階步驟
- 在 Android 平臺(tái)繪制一張圖片,使用至少 3 種不同的 API,ImageView,SurfaceView,自定義 View
- 在 Android 平臺(tái)使用 AudioRecord 和 AudioTrack API 完成音頻 PCM 數(shù)據(jù)的采集和播放,并實(shí)現(xiàn)讀寫音頻 wav 文件
- 在 Android 平臺(tái)使用 Camera API 進(jìn)行視頻的采集,分別使用 SurfaceView、TextureView 來預(yù)覽 Camera 數(shù)據(jù),取到 NV21 的數(shù)據(jù)回調(diào)
- 學(xué)習(xí) Android 平臺(tái)的 MediaExtractor 和 MediaMuxer API,知道如何解析和封裝 mp4 文件
- 學(xué)習(xí) Android 平臺(tái) OpenGL ES API,了解 OpenGL 開發(fā)的基本流程,使用 OpenGL 繪制一個(gè)三角形
- 學(xué)習(xí) Android 平臺(tái) OpenGL ES API,學(xué)習(xí)紋理繪制,能夠使用 OpenGL 顯示一張圖片
- 學(xué)習(xí) MediaCodec API,完成音頻 AAC 硬編、硬解
- 學(xué)習(xí) MediaCodec API,完成視頻 H.264 的硬編、硬解
- 串聯(lián)整個(gè)音視頻錄制流程,完成音視頻的采集、編碼、封包成 mp4 輸出
- 串聯(lián)整個(gè)音視頻播放流程,完成 mp4 的解析、音視頻的解碼、播放和渲染
- 進(jìn)一步學(xué)習(xí) OpenGL,了解如何實(shí)現(xiàn)視頻的剪裁、旋轉(zhuǎn)、水印、濾鏡,并學(xué)習(xí) OpenGL 高級(jí)特性,如:VBO,VAO,F(xiàn)BO 等等
- 學(xué)習(xí) Android 圖形圖像架構(gòu),能夠使用 GLSurfaceviw 繪制 Camera 預(yù)覽畫面
- 深入研究音視頻相關(guān)的網(wǎng)絡(luò)協(xié)議,如 rtmp,hls,以及封包格式,如:flv,mp4
- 深入學(xué)習(xí)一些音視頻領(lǐng)域的開源項(xiàng)目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
- 將 ffmpeg 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),編寫一款簡(jiǎn)易的音視頻播放器
- 將 x264 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),完成視頻數(shù)據(jù) H264 軟編功能
- 將 librtmp 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),完成 Android RTMP 推流功能
- 上面積累的經(jīng)驗(yàn),做一款短視頻 APP,完成如:斷點(diǎn)拍攝、添加水印、本地轉(zhuǎn)碼、視頻剪輯、視頻拼接、MV 特效等功能
看到?jīng)]這一條一條的.列的多好,我準(zhǔn)備花半年的時(shí)間來學(xué)習(xí).
實(shí)現(xiàn)第一條
- 在 Android 平臺(tái)繪制一張圖片,使用至少 3 種不同的 API,ImageView,SurfaceView,自定義 View
ImageView,自定義就不用說了吧,下面重點(diǎn)看看SurfaceView的繪制圖片.
直接上代碼:
public class SurfaceViewDraw extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;
private Paint paint;
private Rect aa;
private Bitmap bitmap;
public SurfaceViewDraw(Context context) {
this(context, null);
}
public SurfaceViewDraw(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SurfaceViewDraw(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//得到控制器
surfaceHolder = getHolder();
//對(duì)surfaceview進(jìn)行操作
surfaceHolder.addCallback(this);
paint = new Paint();
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.olo);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//重要的一點(diǎn)要說明.在這里可以在線程里面用canvas繪制圖片,所以為什么SurfaceView比較時(shí)候繪制圖片和圖形
Canvas canvas = surfaceHolder.lockCanvas();
//開始畫
canvas.drawBitmap(bitmap, new Matrix(), paint);
//解鎖畫布
surfaceHolder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//surface 大小發(fā)生變化的時(shí)候
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//銷毀時(shí)發(fā)生,一般在這里將畫圖停止.釋放
}
}
結(jié)果

第一步很好實(shí)現(xiàn)了!繼續(xù)努力!!,堅(jiān)持下去!!!