乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      andeoid硬件解碼學(xué)習(xí) (二)

       傳真閱覽室 2014-01-19

      Finally, I must say, finally, we get low-level media APIs in Android, the Android hardware decoding and encoding APIs are finally available. It was a thing since Android 4.1 in Google IO 2012, but until now, when a new Android version 4.2 has been released, those low-level APIs are still too hard to use. There're so many Android vendors, we can't even get the same results from all Google's Nexus devices.

      Despite the annoyings, I still tried these APIs and prayed them to get better in next Android release, and next Android release would swallow market quikly.

      I just finished a simple video player with the combination of MediaExtractor and MediaCodec, you may find the full project from my Github.

      private MediaExtractor extractor;
      private MediaCodec decoder;
      private Surface surface;
      
      public void run() {
        extractor = new MediaExtractor();
        extractor.setDataSource(SAMPLE);
      
        for (int i = 0; i < extractor.getTrackCount(); i++) {
          MediaFormat format = extractor.getTrackFormat(i);
          String mime = format.getString(MediaFormat.KEY_MIME);
          if (mime.startsWith("video/")) {
            extractor.selectTrack(i);
            decoder = MediaCodec.createDecoderByType(mime);
            decoder.configure(format, surface, null, 0);
            break;
          }
        }
      
        if (decoder == null) {
          Log.e("DecodeActivity", "Can't find video info!");
          return;
        }
      
        decoder.start();
      
        ByteBuffer[] inputBuffers = decoder.getInputBuffers();
        ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
        BufferInfo info = new BufferInfo();
        boolean isEOS = false;
        long startMs = System.currentTimeMillis();
      
        while (!Thread.interrupted()) {
          if (!isEOS) {
            int inIndex = decoder.dequeueInputBuffer(10000);
            if (inIndex >= 0) {
              ByteBuffer buffer = inputBuffers[inIndex];
              int sampleSize = extractor.readSampleData(buffer, 0);
              if (sampleSize < 0) {
                Log.d("DecodeActivity", "InputBuffer BUFFER_FLAG_END_OF_STREAM");
                decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
                isEOS = true;
              } else {
                decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0);
                extractor.advance();
              }
            }
          }
      
          int outIndex = decoder.dequeueOutputBuffer(info, 10000);
          switch (outIndex) {
          case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
            Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");
            outputBuffers = decoder.getOutputBuffers();
            break;
          case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
            Log.d("DecodeActivity", "New format " + decoder.getOutputFormat());
            break;
          case MediaCodec.INFO_TRY_AGAIN_LATER:
            Log.d("DecodeActivity", "dequeueOutputBuffer timed out!");
            break;
          default:
            ByteBuffer buffer = outputBuffers[outIndex];
            Log.v("DecodeActivity"
      , "We can't use this buffer but render it due to the API limit, " + buffer);
      
            // We use a very simple clock to keep the video FPS, or the video
            // playback will be too fast
            while (info.presentationTimeUs / 1000 > System.currentTimeMillis() - startMs) {
              try {
                sleep(10);
              } catch (InterruptedException e) {
                e.printStackTrace();
                break;
              }
            }
            decoder.releaseOutputBuffer(outIndex, true);
            break;
          }
      
          if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
            Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");
            break;
          }
        }
      
        decoder.stop();
        decoder.release();
        extractor.release();
      }
      

      Compared to the OMXCodec methods introduced in an early post, this method is more recommended if you're targeting Android 4.1 and later. But it's still too limited, you can't do anything with the decoded video frame, because there're more than 40 color formats to deal with and many of them are vendor proprietary without documentation.

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多