1. 程式人生 > >Android視訊編碼--H264編碼

Android視訊編碼--H264編碼

Android視訊編碼–H264編碼

Android中的H264編碼有兩種編碼方式:

  • 硬編碼
  • 軟編碼

1.硬編碼

Android中的H264硬編碼主要是通過自身提供的API,呼叫底層的硬體模組實現編碼,不使用CPU。
採用硬編碼的核心示例程式碼如下:

void encodeYuvFrame(byte[] yuvFrame) {
        ByteBuffer[] inBuffers;
        ByteBuffer[] outBuffers;
        int bufferIndex;
        inBuffers = mEncoder.getInputBuffers();
        outBuffers = mEncoder.getOutputBuffers();
        bufferIndex= mEncoder.dequeueInputBuffer(-1
); if (bufferIndex>= 0) { ByteBuffer bb = inBuffers[bufferIndex]; bb.clear(); bb.put(yuvFrame, 0, yuvFrame.length); long pts = System.nanoTime() / 1000 - mPresentTimeUs; mEncoder.queueInputBuffer(bufferIndex, 0, yuvFrame.length, pts, 0); } for
(; ; ) { int bufferIndex= mEncoder.dequeueOutputBuffer(vebi, 0); if (bufferIndex >= 0) { ByteBuffer bb = outBuffers[bufferIndex];//編碼資料,可在此進行處理資料 mEncoder.releaseOutputBuffer(bufferIndex, false); } else { break; } } }

2.軟編碼

Android中的軟編碼主要是使用第三方的編碼庫,如x264,openh264等,然後通過jni呼叫完成編碼。因為要使用CPU,所以在編碼時可能會造成手機發熱。
之前在專案中,用過x264以及openh264進行軟編。庫使用這兩個庫進行編碼,接收的視訊資料格式是YUV420P,如果從攝像頭採集到的資料不是這種格式的,需要進行一下資料格式的轉換,可以藉助libyuv來完成。通過使用這兩個庫發現,openh264的編碼效率要比x264的庫高,x264的編碼質量要比openh264好。
PS:在使用軟編時,要編譯各種架構需要的庫,有時候怎麼編都不行,真是十分令人頭疼。