2013-04-02 5 views
9

J'utilise MediaCodec bas niveau Api dans android pour décoder le flux brut h264 reçu de IP CAMERA. Flux brut de la caméra IP, réception sur une connexion TCP/IP.décodage streaming H264 en utilisant android api niveau bas

Pour décoder flux, mon code est:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

MediaCodec mCodecc; 
MediaFormat mFormat; 
BufferInfo mInfo; 
ByteBuffer[] inputBuffers ; 
ByteBuffer[] outputBuffers ; 

} 
protected void Init_Codec() 
{ 
    mCodecc = MediaCodec.createDecoderByType("video/avc"); 
    mFormat = MediaFormat.createVideoFormat("video/avc", width, height); 

    mInfo = new BufferInfo(); 
mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); 
    mCodecc.configure(mFormat, holder.getSurface(), null,0); 
} 

protected void Start_Codec() 
{ 
    mCodecc.start();   
    inputBuffers = mCodecc.getInputBuffers(); 
    outputBuffers = mCodecc.getOutputBuffers(); 
} 

private void OnRawStreamReceived(final ByteBuffer buffer) 
{ 

mHandler.postAtFrontOfQueue(new Runnable() { 

@Override 
public void run() 
{ 
     int inIndex = mCodecc.dequeueInputBuffer(10000); 
    if(inIndex>=0) 
    { 
    inputBuffers[inIndex] = buffer; 
    mCodecc.queueInputBuffer(inIndex, 0,buffer.limit(),System.currentTimeMillis(), 0); 
    } 
     int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000); 
     switch (outIndex) { 

    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: 
    Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); 
    outputBuffers = mCodecc.getOutputBuffers(); 
    break; 

    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: 
    Log.d("DecodeActivity", "New format " + mCodecc.getOutputFormat()); 
    break; 

     case MediaCodec.INFO_TRY_AGAIN_LATER: 
    Log.d("DecodeActivity", "dequeueOutputBuffer timed out! --- size : " + mInfo.size); 
    break; 

    default: 
    ByteBuffer buffer = outputBuffers[outIndex]; 

      mCodecc.releaseOutputBuffer(outIndex, true); 
    break; 
    } 
} 


int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000); 

Mais cette ligne de code, je reçois toujours "-1". et mInfo.size() est aussi que je reçois "0". et Il n'affiche rien sur une surface donnée.

Quelle étape me manque. Guidez-moi s'il-vous-plaît. thanx

Répondre

6

Je suppose que vous passez des "unités d'accès" individuelles, c'est-à-dire une trame de vidéo par tampon. Ce que vous semblez manquer, c'est le bloc d'installation du codec, qui devrait être dans le premier tampon soumis (peut également être glissé dans le MediaFormat via format.setByteBuffer("csd-0", ...)). En supposant que les données sortent de votre encodeur particulier, tout ce que vous avez à faire est de mettre en file d'attente le premier tampon avec l'indicateur BUFFER_FLAG_CODEC_CONFIG.

+0

merci !! Je vais vérifier même et vous le faire savoir ... – Arun

+0

@Arun Avez-vous compris? – nmxprime

+0

@fadden. Comment fournir les données csd requises en utilisant le drapeau, je veux dire où puis-je obtenir l'information csd pour H264? – nmxprime