1
mediacodec init:
mediaCodec = MediaCodec.createDecoderByType("video/avc");
mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaFormat.setInteger("color-format", 19);
mediaCodec.configure(mediaFormat, paramSurface, null, 0);
int i = mediaCodec.dequeueOutputBuffer(this.bufferInfo, 0L);

    if (i >= 0)
    {
        int j = i;             

        mediaCodec.releaseOutputBuffer(j, true);

        if ((this.bufferInfo.flags & 0x4) != 0)
            Log.d(TAG, "BUFFER_FLAG_END_OF_STREAM");

        return ;

    }
    else if (i == -3)
    {
        Log.d(TAG, "INFO_OUTPUT_BUFFERS_CHANGED");
        outputBuffers = mediaCodec.getOutputBuffers();
    }
    else if (i == -2)
    {
        MediaFormat localMediaFormat = mediaCodec.getOutputFormat();
        Log.d(TAG, "Output format has changed to " + localMediaFormat);
        Log.d(TAG, "Output format width:" + localMediaFormat.getInteger("width"));
        Log.d(TAG, "Output format height:" + localMediaFormat.getInteger("height"));                    
    }
    else if(i==-1){         
        Log.d(TAG, "dequeueOutputBuffer timeout pts is " + pts);        
    }
4

1 に答える 1

1

コメントで ZTE V987 を意味していると仮定すると、私が見つけた仕様では、PowerVR GPU で Android 4.1.2 を実行すると書かれていますが、ビデオ IP が誰からのものかは述べられていないため、決定的な答えが得られます. ただし、問題は、カラー形式を 19 (平面 YUV 420) にハードコーディングしていることであり、一部のデバイスはそれをサポートしていません。

たとえば、PVR GPU が TI ビデオ (Galaxy Nexus の場合のように) とペアになっている場合、COLOR_TI_FormatYUV420PackedSemiPlanar(半平面形式) が必要になる可能性があります。logcat の出力に関連するメッセージが表示される場合があります。

encodeDecodeVideoFromBuffer()CTS EncodeDecodeTestのメソッドを見ると、メソッドを使用selectColorFormat()して色形式を選択する方法がわかります。この形式でデータを配信するように ffmpeg を構成できない場合は、独自の変換を行う必要があります。generateFrame()レイアウトについては、メソッドを参照してください。

于 2013-11-22T15:45:27.290 に答える