视频播放格式问题android

视频播放格式问题android,第1张

概述我从NV21字节数据中获取视频以使用以下代码,并将其保存.H264格式扩展名,但我的视频在background.it中没有颜色.我的视频URlhttps://youtu.be/Uht3d-q5Zrc显示为黑色,我想将其设为彩色,我将其保存为H264格式转换为NV21字节数据,这可能是原因,如何解决此问题?privatevoidinit

我从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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1210155.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存