[英]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.