Ⅰ 什麼叫硬編碼,它和普通編碼有什麼區別
硬編碼一般指在代碼中寫死的,與它相對的是配置項,可以在程序發布後進行修改的。
舉個例子,比如說你做個軟體,他有菜單欄,你如果把菜單的標題全部寫在代碼里,那如果現在要換英文的,你就不得不改變代碼。
現在換一種方式,你把菜單標題全部寫在一個文本里,比如叫title.txt,現在你要英文,那麼只要把title.txt裡面相對應的值換成英文就可以了。
不用在去該代碼本身。
這就是 使用與配置相分離的概念
還有比如面向介面編程的概念,你可以去網上查,這都可以減少硬編碼帶來的後期維護,相對硬編碼,現階段的就普通編碼更靈活。
Ⅱ 什麼是軟編碼和硬編碼
硬編碼就是一種不夠靈活的代碼方案。
比如說,一個服務期端的程序,在執行時需要創建伺服器進行偵聽,你可以簡單的將它需要偵聽的埠號放在代碼裡面,也可以通過程序參數傳入,也可以通過配置文件放置。
上述的放在代碼裡面的就叫做硬編碼。
Ⅲ android -- 音視頻基礎知識
幀,是視頻的一個基本概念,表示一張畫面,如上面的翻頁動畫書中的一頁,就是一幀。一個視頻就是由許許多多幀組成的。
幀率,即單位時間內幀的數量,單位為:幀/秒 或fps(frames per second)。一秒內包含多少張圖片,圖片越多,畫面越順滑,過渡越自然。 幀率的一般以下幾個典型值:
24/25 fps:1秒 24/25 幀,一般的電影幀率。
30/60 fps:1秒 30/60 幀,游戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。
85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義。
這里我們只講常用到的兩種色彩空間。
RGB的顏色模式應該是我們最熟悉的一種,在現在的電子設備中應用廣泛。通過R G B三種基礎色,可以混合出所有的顏色。
這里著重講一下YUV,這種色彩空間並不是我們熟悉的。這是一種亮度與色度分離的色彩格式。
早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以後,加入了UV兩種色度,形成現在的YUV,也叫YCbCr。
Y:亮度,就是灰度值。除了表示亮度信號外,還含有較多的綠色通道量。
U:藍色通道與亮度的差值。
V:紅色通道與亮度的差值。
音頻數據的承載方式最常用的是 脈沖編碼調制 ,即 PCM 。
在自然界中,聲音是連續不斷的,是一種模擬信號,那怎樣才能把聲音保存下來呢?那就是把聲音數字化,即轉換為數字信號。
我們知道聲音是一種波,有自己的振幅和頻率,那麼要保存聲音,就要保存聲音在各個時間點上的振幅。
而數字信號並不能連續保存所有時間點的振幅,事實上,並不需要保存連續的信號,就可以還原到人耳可接受的聲音。
根據奈奎斯特采樣定理:為了不失真地恢復模擬信號,采樣頻率應該不小於模擬信號頻譜中最高頻率的2倍。
根據以上分析,PCM的採集步驟分為以下步驟:
采樣率,即采樣的頻率。
上面提到,采樣率要大於原聲波頻率的2倍,人耳能聽到的最高頻率為20kHz,所以為了滿足人耳的聽覺要求,采樣率至少為40kHz,通常為44.1kHz,更高的通常為48kHz。
采樣位數,涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續的樣本值,而在數字信號中,信號一般是不連續的,所以模擬信號量化以後,只能取一個近似的整數值,為了記錄這些振幅值,采樣器會採用一個固定的位數來記錄這些振幅值,通常有8位、16位、32位。
位數越多,記錄的值越准確,還原度越高。
最後就是編碼了。由於數字信號是由0,1組成的,因此,需要將幅度值轉換為一系列0和1進行存儲,也就是編碼,最後得到的數據就是數字信號:一串0和1組成的數據。
整個過程如下:
聲道數,是指支持能不同發聲(注意是不同聲音)的音響的個數。 單聲道:1個聲道
雙聲道:2個聲道
立體聲道:默認為2個聲道
立體聲道(4聲道):4個聲道
碼率,是指一個數據流中每秒鍾能通過的信息量,單位bps(bit per second)
碼率 = 采樣率 * 采樣位數 * 聲道數
這里的編碼和上面音頻中提到的編碼不是同個概念,而是指壓縮編碼。
我們知道,在計算機的世界中,一切都是0和1組成的,音頻和視頻數據也不例外。由於音視頻的數據量龐大,如果按照裸流數據存儲的話,那將需要耗費非常大的存儲空間,也不利於傳送。而音視頻中,其實包含了大量0和1的重復數據,因此可以通過一定的演算法來壓縮這些0和1的數據。
特別在視頻中,由於畫面是逐漸過渡的,因此整個視頻中,包含了大量畫面/像素的重復,這正好提供了非常大的壓縮空間。
因此,編碼可以大大減小音視頻數據的大小,讓音視頻更容易存儲和傳送。
視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應時代發展而出現的。
其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯盟主導
MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導。
當然,他們也有聯合制定的編碼標准,那就是現在主流的編碼格式H264,當然還有下一代更先進的壓縮編碼標准H265。
H264是目前最主流的視頻編碼標准,所以我們後續的文章中主要以該編碼格式為基準。
H264由ITU和MPEG共同定製,屬於MPEG-4第十部分內容。
我們已經知道,視頻是由一幀一幀畫面構成的,但是在視頻的數據中,並不是真正按照一幀一幀原始數據保存下來的(如果這樣,壓縮編碼就沒有意義了)。
H264會根據一段時間內,畫面的變化情況,選取一幀畫面作為完整編碼,下一幀只記錄與上一幀完整數據的差別,是一個動態壓縮的過程。
在H264中,三種類型的幀數據分別為
I幀:幀內編碼幀。就是一個完整幀。
P幀:前向預測編碼幀。是一個非完整幀,通過參考前面的I幀或P幀生成。
B幀:雙向預測內插編碼幀。參考前後圖像幀編碼生成。B幀依賴其前最近的一個I幀或P幀及其後最近的一個P幀。
全稱:Group of picture。指一組變化不大的視頻幀。
GOP的第一幀成為關鍵幀:IDR
IDR都是I幀,可以防止一幀解碼出錯,導致後面所有幀解碼出錯的問題。當解碼器在解碼到IDR的時候,會將之前的參考幀清空,重新開始一個新的序列,這樣,即便前面一幀解碼出現重大錯誤,也不會蔓延到後面的數據中。
DTS全稱:Decoding Time Stamp。標示讀入內存中數據流在什麼時候開始送入解碼器中進行解碼。也就是解碼順序的時間戳。
PTS全稱:Presentation Time Stamp。用於標示解碼後的視頻幀什麼時候被顯示出來。
前面我們介紹了RGB和YUV兩種圖像色彩空間。H264採用的是YUV。
YUV存儲方式分為兩大類:planar 和 packed。
planar如下:
packed如下:
上面說過,由於人眼對色度敏感度低,所以可以通過省略一些色度信息,即亮度共用一些色度信息,進而節省存儲空間。因此,planar又區分了以下幾種格式:YUV444、 YUV422、YUV420。
YUV 4:4:4采樣,每一個Y對應一組UV分量。
YUV 4:2:2采樣,每兩個Y共用一組UV分量。
YUV 4:2:0采樣,每四個Y共用一組UV分量。
其中,最常用的就是YUV420。
YUV420屬於planar存儲方式,但是又分兩種類型:
YUV420P:三平面存儲。數據組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。
YUV420SP:兩平面存儲。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)
原始的PCM音頻數據也是非常大的數據量,因此也需要對其進行壓縮編碼。
和視頻編碼一樣,音頻也有許多的編碼格式,如:WAV、MP3、WMA、APE、FLAC等等,音樂發燒友應該對這些格式非常熟悉,特別是後兩種無損壓縮格式。
但是,我們今天的主角不是他們,而是另外一個叫AAC的壓縮格式。
AAC是新一代的音頻有損壓縮技術,一種高壓縮比的音頻壓縮演算法。在MP4視頻中的音頻數據,大多數時候都是採用AAC壓縮格式。
AAC格式主要分為兩種:ADIF、ADTS。
ADIF:Audio Data Interchange Format。音頻數據交換格式。這種格式的特徵是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。這種格式常用在磁碟文件中。
ADTS:Audio Data Transport Stream。音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3數據流格式。
ADIF數據格式:
ADTS 一幀 數據格式(中間部分,左右省略號為前後數據幀):
AAC內部結構也不再贅述,可以參考AAC 文件解析及解碼流程
細心的讀者可能已經發現,前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時使用到的視頻格式,比如:mp4、rmvb、avi、mkv、mov...
沒錯,這些我們熟悉的視頻格式,其實是包裹了音視頻編碼數據的容器,用來把以特定編碼標准編碼的視頻流和音頻流混在一起,成為一個文件。
例如:mp4支持H264、H265等視頻編碼和AAC、MP3等音頻編碼。
我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇,但是我們大部分時候並不能感覺出他們的區別,對於普通用戶來說,只要能播放就行了。
那麼他們內部究竟有什麼區別呢?
在手機或者PC上,都會有CPU、GPU或者解碼器等硬體。通常,我們的計算都是在CPU上進行的,也就是我們軟體的執行晶元,而GPU主要負責畫面的顯示(是一種硬體加速)。
所謂軟解碼,就是指利用CPU的計算能力來解碼,通常如果CPU的能力不是很強的時候,一則解碼速度會比較慢,二則手機可能出現發熱現象。但是,由於使用統一的演算法,兼容性會很好。
硬解碼,指的是利用手機上專門的解碼晶元來加速解碼。通常硬解碼的解碼速度會快很多,但是由於硬解碼由各個廠家實現,質量參差不齊,非常容易出現兼容性問題。
MediaCodec 是Android 4.1(api 16)版本引入的編解碼介面,是所有想在Android上開發音視頻的開發人員繞不開的坑。
由於Android碎片化嚴重,雖然經過多年的發展,Android硬解已經有了很大改觀,但實際上各個廠家實現不同, 還是會有一些意想不到的坑。
相對於FFmpeg,Android原生硬解碼還是相對容易入門一些,所以接下來,我將會從MediaCodec入手,講解如何實現視頻的編解碼,以及引入OpenGL實現對視頻的編輯,最後才引入FFmpeg來實現軟解,算是一個比較常規的音視頻開發入門流程吧。
Ⅳ 硬編碼和軟編碼區分
一:硬編碼
在計算機程序或文本編輯中,硬編碼是指將可變變數用一個固定值來代替的方法。用這種方法編譯後,如果以後需要更改此變數就非常困難了。大部分程序語言里,可以將一個固定數值定義為一個標記,然後用這個特殊標記來取代變數名稱。當標記名稱改變時,變數名不變,這樣,當重新編譯整個程序時,所有變數都不再是固定值,這樣就更容易的實現了改變變數的目的。盡管通過編輯器的查找替換功能也能實現整個變數名稱的替換,但也很有可能出現多換或者少換的情況,而在計算機程序中,任何小錯誤的出現都是不可饒恕的。最好的方法是單獨為變數名劃分空間,來實現這種變化,就如同前面說的那樣,將需要改變的變數名暫時用一個定義好的標記名稱來代替就是一種很好的方法。通常情況下,都應該避免使用硬編碼方法。
java小例子: int a=2,b=2;
硬編碼:if(a==2) return false;
不是硬編碼 if(a==b) return true;
不過軟編碼比硬編碼要復雜一些,對以後的考慮要周到一些。軟編碼是一種設計,而硬編碼不過是一種具體的實現。軟體開發不只是需要一個軟體的實現,更需要軟體能夠很好的修改,方便得擴展,所以需要一些設計技巧在裡面其實我們常說對程序進一步重構,我們目的就是實現對象之間的松耦合,使程序能夠應對多種情況下的變化,具有一定的擴展性,對於這兩個名詞其實它的背後隱藏的是一種設計思想,硬編碼和軟編碼只是一種表現在實際情況中一種問題,而這種思想可以應用於多個方面,面對多個問題。
硬編碼和軟編碼的區別是:軟編碼可以在運行時確定,修改;而硬編碼是不能夠改變的。所有的硬編碼和軟編碼的區別都可以有這個意思擴展開。
Ⅳ Android平台FFmpeg實現rtmp推流-C++的實現
視頻編碼有幾種方式:
1.硬編碼,使用MediaCodec實現
2.軟編碼,使用FFmpeg或者libx264庫來實現。
本文分享在Android平台視頻編碼-軟編碼的實現,也就是用FFmpeg來實現視頻的編碼,rtmp推流到伺服器上,相機採集視頻將在下一篇文章分享。
流媒體伺服器使用 nginx-rtmp-mole 來進行搭建。
本文所使用FFmpeg的版本是4.1,關於FFmpeg編譯成Android平台so庫如果有需要,我將在下一篇文章分享說明。
視頻編碼比較耗cpu,上傳視頻數據的會耗網路io,所以需要開啟新線程去處理,這里我用HandlerThread來處理視頻的編碼上傳。
初始化編碼相關操作
這里我們使用的是FFmpeg,所以在編碼前我們會先做一些初始化以及參數設置工作。
FFmpeg初始化
av_register_all()
創建輸出格式上下文
avformat_alloc_output_context2()
獲取編碼器
avcodec_find_encoder(AV_CODEC_ID_H264) 獲取H264的編碼器
設置編碼器參數
使用給定的編碼器和參數初始化編碼上下文
avcodec_open2(pCodecCtx, pCodec, ¶m)
創建視頻流
video_st = avformat_new_stream(ofmt_ctx, pCodec)
打開輸出上下文
avio_open(&ofmt_ctx->pb, out_path, AVIO_FLAG_READ_WRITE)
寫入輸出頭信息
avformat_write_header(ofmt_ctx, NULL)
像素格式轉換
AV_PIX_FMT_YUV420P,它是純平面存儲。總共三個平面,分別存放,Y、U、V數據。
當圖像寬是width,高是height時,Y分量的大小就是width×heitht,而U是width×heitht/4,V也是U是width×heitht/4。
H264編碼
首先我們需要了解兩個數據結構AVFrame、AVPacket
AVFrame存放的是原始數據、AVPacket存放的是編碼後的數據。
創建AVPacket
av_new_packet(&enc_pkt, picture_size);
開始編碼
ret = avcodec_encode_video2(pCodecCtx, pFrameYUV);
輸出一幀編碼後的視頻數據
ret = av_write_frame(pCodecCtx, &enc_pkt);
釋放資源
小夥伴們有疑問的可以在下方評論區評論。
Ⅵ 手機屏幕映射用軟編碼還是硬編碼好
嗯,硬編碼好一點,因為硬編碼的話用起來比較方便,而且耐用程度比較高。
Ⅶ 請問什麼叫硬編碼,它和普通編碼有什麼區別
硬編碼是將數據直接嵌入到程序或其他可執行對象的源代碼中的軟體開發實踐,與從外部獲取數據或在運行時生成數據不同。
硬編碼數據通常只能通過編輯源代碼和重新編譯可執行文件來修改,盡管可以使用調試器或十六進制編輯器在內存或磁碟上進行更改。
硬編碼的數據通常表示不變的信息,例如物理常量,版本號和靜態文本元素。 另一方面,軟編碼數據對用戶輸入,HTTP伺服器響應或配置文件等任意信息進行編碼,並在運行時確定。
它和普通編碼的區別是:
1、編碼方式不同:
普通編碼:使用CPU進行編碼。
硬編碼:使用非CPU進行編碼,如顯卡GPU、專用的DSP、FPGA、ASIC晶元等。
2、使用方式不同:
普通編碼:實現直接、簡單,參數調整方便,升級易,但CPU負載重,性能較硬編碼低,低碼率下質量通常比硬編碼要好一點
硬編碼:性能高,低碼率下通常質量低於軟編碼器,但部分產品在GPU硬體平台移植了優秀的軟編碼演算法(如X264)的,質量基本等同於軟編碼
3、復雜程度不同:
普通編碼比硬編碼要復雜一些,對以後的考慮要周到一些。普通編碼是一種設計,而硬編碼不過是一種具體的實現。軟體開發不只是需要一個軟體的實現,更需要軟體能夠很好的修改,方便得擴展,所以需要一些設計技巧在裡面。
(7)android硬編碼軟編碼擴展閱讀:
在許多情況下,單個硬編碼值(例如數組大小)可能會在程序的源代碼中出現多次。這將是一個神奇的數字。如果值的某些外觀被修改,這可能通常會導致程序錯誤,但不是全部。這樣的錯誤很難找到,並且可能會長時間保留在程序中。
如果相同的硬編碼值用於多於一個參數值,例如,可能會出現類似的問題。一個由6個元素組成的數組,最小輸入字元串長度為6。
程序員可能會錯誤地更改值的所有實例(通常使用編輯器的搜索和替換工具),而無需檢查代碼以查看每個實例的使用方式。通過定義將名稱與值相關聯的常量並在代碼中使用每個外觀的常量名稱,可以避免這兩種情況。