簡體   English   中英

使用 mediacodec 從位圖文件創建視頻

[英]Create video from bitmap files using mediacodec

我的 SD 卡上有位圖文件列表。 現在,我想使用 mediacodec 創建視頻。 我檢查了MediaCodec文檔。我找不到創建視頻的方法。 我不想使用 FFmpeg。 我試過下面的代碼。 任何幫助,將不勝感激!!

protected void MergeVideo() throws IOException {
        // TODO Auto-generated method stub
        MediaCodec mMediaCodec;
        MediaFormat mMediaFormat;
        ByteBuffer[] mInputBuffers;
        mMediaCodec = MediaCodec.createEncoderByType("video/avc");
        mMediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240);
        mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
        mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
        mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
        mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
        mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        mMediaCodec.start();
        mInputBuffers = mMediaCodec.getInputBuffers();
        //for (int i = 0; i<50; i++) {
        int i=0;
            int j=String.valueOf(i).length()<1?Integer.parseInt("0"+i) : i;
           File imagesFile = new File(Environment.getExternalStorageDirectory() + "/VIDEOFRAME/","frame-"+j+".png");

         Bitmap bitmap = BitmapFactory.decodeFile(imagesFile.getAbsolutePath());
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); // image is the bitmap
        byte[] input = byteArrayOutputStream.toByteArray();

        int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
        if (inputBufferIndex >= 0) {
            ByteBuffer inputBuffer = mInputBuffers[inputBufferIndex];
            inputBuffer.clear();
            inputBuffer.put(input);
            mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
        }

你少了幾塊。 這個問題的答案包含您需要的一些信息,但它是為特別需要 API 16 支持的人編寫的。如果您願意以 API 18 及更高版本為目標,那么您的生活會更輕松。

您所擁有的最大問題是來自 ByteBuffer 的 MediaCodec 輸入始終采用未壓縮的 YUV 格式,但您似乎正在傳遞壓縮的 PNG 圖像。您需要將位圖轉換為 YUV。 執行此操作的確切布局和最佳方法因設備而異(有些使用平面,有些使用半平面),但您可以找到這樣做的代碼。 或者只是看看在EncodeDecodeTest的緩沖區到緩沖區部分中生成幀的方式。

或者,使用 Surface 輸入到 MediaCodec。 將 Canvas 附加到輸入表面並在其上繪制位圖。 EncodeAndMuxTest本質上是這樣做的,但使用 OpenGL ES。

一個潛在的問題是您為幀時間戳傳入 0。 您應該傳入一個真實的(生成的)時間戳,以便該值與編碼幀一起轉發到 MediaMuxer。

在最新的設備 (API 21+) 上,MediaRecorder 可以接受 Surface 輸入。 這可能比 MediaCodec 更容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM