新聞中心
場(chǎng)景介紹

成都創(chuàng)新互聯(lián)長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為子長(zhǎng)企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,子長(zhǎng)網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
視頻編解碼的主要工作是將視頻進(jìn)行編碼和解碼。
接口說明
| 接口名 | 功能描述 |
|---|---|
| createDecoder() | 創(chuàng)建解碼器Codec實(shí)例。 |
| createEncoder() | 創(chuàng)建編碼器Codec實(shí)例。 |
| registerCodecListener(ICodecListener listener) | 注冊(cè)偵聽器用來異步接收編碼或解碼后的數(shù)據(jù)。 |
| setSource(Source source, TrackInfo trackInfo) | 根據(jù)解碼器的源軌道信息設(shè)置數(shù)據(jù)源,對(duì)于編碼器trackInfo無效。 |
| setSourceFormat(Format format) | 編碼器的管道模式下,設(shè)置編碼器編碼格式。 |
| setCodecFormat(Format format) | 普通模式設(shè)置編/解碼器參數(shù)。 |
| setVideoSurface(Surface surface) | 設(shè)置解碼器的Surface。 |
| getAvailableBuffer(long timeout) | 普通模式獲取可用ByteBuffer。 |
| writeBuffer(ByteBuffer buffer, BufferInfo info) | 推送源數(shù)據(jù)給Codec。 |
| getBufferFormat(ByteBuffer buffer) | 獲取輸出Buffer數(shù)據(jù)格式。 |
| start() | 啟動(dòng)編/解碼。 |
| stop() | 停止編/解碼。 |
| release() | 釋放所有資源。 |
普通模式開發(fā)步驟
在普通模式下進(jìn)行編解碼,應(yīng)用必須持續(xù)地傳輸數(shù)據(jù)到 Codec 實(shí)例。
編碼的具體開發(fā)步驟如下:
- 創(chuàng)建編碼 Codec 實(shí)例,可調(diào)用 createEncoder() 創(chuàng)建。
final Codec encoder = Codec.createEncoder();- 構(gòu)造數(shù)據(jù)源格式,并設(shè)置給 Codec 實(shí)例,調(diào)用 setCodecFormat(),代碼示例如下:
Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
fmt.putIntValue(Format.FRAME_INTERVAL, -1);
codec.setCodecFormat(fmt);- 如果需要編碼過程中,檢測(cè)是否讀取到 Buffer 數(shù)據(jù)以及是否發(fā)生異常,可以構(gòu)造 ICodecListener, ICodecListener 需要實(shí)現(xiàn)兩個(gè)方法,實(shí)現(xiàn)讀到 Buffer 數(shù)據(jù)時(shí)、編碼發(fā)生異常時(shí)做相應(yīng)的操作。舉例中讀到 buffer 時(shí),獲取 buffer 的 format 格式,異常時(shí)拋出運(yùn)行時(shí)異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {
@Override
public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
Format fmt = codec.getBufferFormat(byteBuffer);
}
@Override
public void onError(int errorCode, int act, int trackId) {
throw new RuntimeException();
}
};- 調(diào)用 start() 方法開始編碼。
- 調(diào)用 getAvailableBuffer() 取到一個(gè)可用的 ByteBuffer,把數(shù)據(jù)填入 ByteBuffer 里,然后再調(diào)用 writeBuffer() 把 ByteBuffer 寫入編碼器實(shí)例。
- 調(diào)用 stop() 方法停止編碼。
- 編碼任務(wù)結(jié)束后,調(diào)用 release() 釋放資源。
解碼的具體開發(fā)步驟如下:
- 創(chuàng)建解碼 Codec 實(shí)例,可調(diào)用 createDecoder() 創(chuàng)建。
- 構(gòu)造數(shù)據(jù)源格式,并設(shè)置給 Codec 實(shí)例,調(diào)用 setCodecFormat(),代碼示例如下:
Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
fmt.putIntValue(Format.FRAME_INTERVAL, -1);
codec.setCodecFormat(fmt);- (可選)如果需要解碼過程中,檢測(cè)是否讀取到 Buffer 數(shù)據(jù)以及是否發(fā)生異常,可以構(gòu)造 ICodecListener,ICodecListener 需要實(shí)現(xiàn)兩個(gè)方法,實(shí)現(xiàn)讀到 Buffer 數(shù)據(jù)時(shí)、解碼發(fā)生異常時(shí)做相應(yīng)的操作。舉例中讀到 buffer 時(shí),獲取 buffer 的 format 格式,異常時(shí)拋出運(yùn)行時(shí)異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {
@Override
public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
Format fmt = codec.getBufferFormat(byteBuffer);
}
@Override
public void onError(int errorCode, int act, int trackId) {
throw new RuntimeException();
}
};- 調(diào)用 start() 方法開始解碼。
- 調(diào)用 getAvailableBuffer 取到一個(gè)可用的 ByteBuffer,把數(shù)據(jù)填入 ByteBuffer 里,然后再調(diào)用 writeBuffer 把 ByteBuffer 寫入解碼器實(shí)例。
- 調(diào)用 stop() 方法停止解碼。
- 解碼任務(wù)結(jié)束后,調(diào)用 release() 釋放資源。
管道模式開發(fā)步驟
管道模式下應(yīng)用只需要調(diào)用 Source 類的 setSource() 方法,數(shù)據(jù)會(huì)自動(dòng)解析并傳輸給 Codec 實(shí)例。管道模式編碼支持視頻流編碼和音頻流編碼。
編碼的具體開發(fā)步驟如下:
- 調(diào)用 createEncoder() 創(chuàng)建編碼 Codec 實(shí)例。
- 調(diào)用 setSource() 設(shè)置數(shù)據(jù)源,支持設(shè)定文件路徑或者文件 File Descriptor。
- 構(gòu)造數(shù)據(jù)源格式或者從 Extractor 中讀取數(shù)據(jù)源格式,并設(shè)置給 Codec 實(shí)例,調(diào)用 setSourceFormat(),構(gòu)造數(shù)據(jù)原格式代碼示例如下:
Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
fmt.putIntValue(Format.FRAME_INTERVAL, -1);
codec.setSourceFormat(fmt);- (可選)如果需要編碼過程中,檢測(cè)是否讀取到 Buffer 數(shù)據(jù)以及是否發(fā)生異常,可以構(gòu)造 ICodecListener,ICodecListener 需要實(shí)現(xiàn)兩個(gè)方法,實(shí)現(xiàn)讀到 Buffer 數(shù)據(jù)時(shí)、編碼發(fā)生異常時(shí)做相應(yīng)的操作。舉例中讀到 buffer 時(shí),獲取 buffer 的 format 格式,異常時(shí)拋出運(yùn)行時(shí)異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {
@Override
public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
Format fmt = codec.getBufferFormat(byteBuffer);
}
@Override
public void onError(int errorCode, int act, int trackId) {
throw new RuntimeException();
}
};- 調(diào)用 start() 方法開始編碼。
- 調(diào)用 stop() 方法停止編碼。
- 編碼任務(wù)結(jié)束后,調(diào)用 release() 釋放資源。
解碼的具體開發(fā)步驟如下:
- 調(diào)用 createDecoder()創(chuàng)建解碼 Codec 實(shí)例。
- 調(diào)用 setSource()設(shè)置數(shù)據(jù)源,支持設(shè)定文件路徑或者文件 File Descriptor。
- (可選)如果需要解碼過程中,檢測(cè)是否讀取到 Buffer數(shù)據(jù)以及是否發(fā)生異常,可以構(gòu)造 ICodecListener,ICodecListener 需要實(shí)現(xiàn)兩個(gè)方法,實(shí)現(xiàn)讀到 Buffer 數(shù)據(jù)時(shí)、解碼發(fā)生異常時(shí)做相應(yīng)的操作。舉例中讀到 buffer 時(shí),獲取 buffer 的 format 格式,異常時(shí)拋出運(yùn)行時(shí)異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {
@Override
public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
Format fmt = codec.getBufferFormat(byteBuffer);
}
@Override
public void onError(int errorCode, int act, int trackId) {
throw new RuntimeException();
}
};- 調(diào)用 start() 方法開始解碼。
- 調(diào)用 stop() 方法停止解碼。
- 解碼任務(wù)結(jié)束后,調(diào)用 release() 釋放資源。
名稱欄目:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS視頻編解碼開發(fā)指導(dǎo)
路徑分享:http://www.5511xx.com/article/cddeiho.html


咨詢
建站咨詢
