
我从NV21字节数据中获取视频以使用以下代码,并将其保存.H264格式扩展名,但我的视频在background.it中没有颜色.我的视频URl https://youtu.be/Uht3d-q5Zrc显示为黑色,我想将其设为彩色,我将其保存为H264格式转换为NV21字节数据,这可能是原因,如何解决此问题?
private voID initCodec() { try { mMediaCodec = MediaCodec.createEncoderByType("vIDeo/avc"); } catch (IOException e) { e.printstacktrace(); } MediaFormat mediaFormat = MediaFormat.createVIDeoFormat("vIDeo/avc", 1280, 720); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 360); //vIDeo second mediaFormat.setInteger(MediaFormat.KEY_color_FORMAT, MediaCodecInfo.CodecCapabilitIEs.color_FormatYUV420Planar);/* mDestData = new byte[1280 * 720 * ImageFormat.getBitsPerPixel(ImageFormat.YV12) / 8];*/ mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONfigURE_FLAG_ENCODE); mMediaCodec.start();}编码NV21字节数据
//VIDeo format H264private synchronized voID encode(byte[] data) { ByteBuffer[] inputBuffers = mMediaCodec.getinputBuffers(); ByteBuffer[] outputBuffers = mMediaCodec.getoutputBuffers(); int inputBufferIndex = mMediaCodec.dequeueinputBuffer(-1); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.capacity(); inputBuffer.clear(); inputBuffer.put(data); mMediaCodec.queueinputBuffer(inputBufferIndex, 0, data.length, 0, 0); } else { return; } MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0); Log.i(TAG, "outputBufferIndex-->" + outputBufferIndex); do { if (outputBufferIndex >= 0) { ByteBuffer outBuffer = outputBuffers[outputBufferIndex]; System.out.println("buffer info-->" + bufferInfo.offset + "--" + bufferInfo.size + "--" + bufferInfo.flags + "--" + bufferInfo.presentationTimeUs); byte[] outData = new byte[bufferInfo.size]; outBuffer.get(outData); try { if (bufferInfo.offset != 0) { fos.write(outData, bufferInfo.offset, outData.length - bufferInfo.offset); } else { fos.write(outData, 0, outData.length); } fos.flush(); Log.i(TAG, "out data -- > " + outData.length); mMediaCodec.releaSEOutputBuffer(outputBufferIndex, false); outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0); } catch (IOException e) { e.printstacktrace(); } } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = mMediaCodec.getoutputBuffers(); } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { MediaFormat format = mMediaCodec.getoutputFormat(); } } while (outputBufferIndex >= 0);}我正在使用这种转换格式,它比旧的格式要好,但无法提供真实的相机视图
public static byte[] YV12toYUV420Planar(byte[] input, byte[] output, int wIDth, int height) { final int frameSize = (wIDth * height); final int qframeSize = frameSize/4; System.arraycopy(input, 0, output, 0, frameSize); // Y System.arraycopy(input, frameSize, output, frameSize + qframeSize, qframeSize); // Cr (V) System.arraycopy(input, frameSize + qframeSize, output, frameSize, qframeSize); // Cb (U) return output;}最后我打电话
private CameraProxy.CameraDataCallBack callBack = new CameraProxy.CameraDataCallBack() { @OverrIDe public voID onDataBack(byte[] data, long length) { // Todo auto-generated method stub Log.i(TAG, "length . " + length); photo = new file(Environment.getExternalStorageDirectory().getabsolutePath() + "/", "photo"+i+".jpg"); byte[]outpt = new byte[data.length]; byte[] datam = YV12toYUV420Planar(data,outpt,1280,720); encode(datam);}解决方法:
试试这个代码
public static byte[] NV21toYUV420Planar(byte[] input, byte[] output, int wIDth, int height) { final int frameSize = wIDth * height; final int qframeSize = frameSize/4; System.arraycopy(input, 0, output, 0, frameSize); // Y byte v, u; for (int i = 0; i < qframeSize; i++) { v = input[frameSize + i*2]; u = input[frameSize + i*2 + 1]; output[frameSize + i + qframeSize] = v; output[frameSize + i] = u; } return output;} 总结 以上是内存溢出为你收集整理的视频播放格式问题android全部内容,希望文章能够帮你解决视频播放格式问题android所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)