2011-05-16 9 views
5

J'essaie de décoder le flux h264 du serveur rtsp et de le restituer sur l'iPhone.FFmpeg ne décode pas le flux h264

J'ai trouvé quelques bibliothèques et j'ai lu quelques articles à ce propos.

Les bibliothèques proviennent de dropCam pour iPhone et s'appellent RTSPClient et DecoderWrapper.

Mais je ne peux pas décoder les données de trame avec DecodeWrapper qui utilise sur ffmpeg.

Voici mon code.

VideoViewer.m 

- (void)didReceiveFrame:(NSData*)frameData presentationTime:(NSDate*)presentationTime 
{ 
    [VideoDecoder staticInitialize]; 
    mConverter = [[VideoDecoder alloc] initWithCodec:kVCT_H264 colorSpace:kVCS_RGBA32 width:320 height:240 privateData:nil]; 


    [mConverter decodeFrame:frameData]; 

    if ([mConverter isFrameReady]) { 
     UIImage *imageData =[mConverter getDecodedFrame]; 
     if (imageData) { 
      [mVideoView setImage:imageData]; 
      NSLog(@"decoded!"); 
     } 
    } 
} 

---VideoDecoder.m--- 
- (id)initWithCodec:(enum VideoCodecType)codecType 
     colorSpace:(enum VideoColorSpace)colorSpace 
       width:(int)width 
      height:(int)height 
     privateData:(NSData*)privateData { 
    if(self = [super init]) { 

     codec = avcodec_find_decoder(CODEC_ID_H264); 
     codecCtx = avcodec_alloc_context(); 

     // Note: for H.264 RTSP streams, the width and height are usually not specified (width and height are 0). 
     // These fields will become filled in once the first frame is decoded and the SPS is processed. 
     codecCtx->width = width; 
     codecCtx->height = height; 

     codecCtx->extradata = av_malloc([privateData length]); 
     codecCtx->extradata_size = [privateData length]; 
     [privateData getBytes:codecCtx->extradata length:codecCtx->extradata_size]; 
     codecCtx->pix_fmt = PIX_FMT_RGBA; 
#ifdef SHOW_DEBUG_MV 
     codecCtx->debug_mv = 0xFF; 
#endif 

     srcFrame = avcodec_alloc_frame(); 
     dstFrame = avcodec_alloc_frame(); 

     int res = avcodec_open(codecCtx, codec); 
     if (res < 0) 
     { 
      NSLog(@"Failed to initialize decoder"); 
     } 

    } 

    return self;  
} 

- (void)decodeFrame:(NSData*)frameData { 


    AVPacket packet = {0}; 
    packet.data = (uint8_t*)[frameData bytes]; 
    packet.size = [frameData length]; 

    int frameFinished=0; 
    NSLog(@"Packet size===>%d",packet.size); 
    // Is this a packet from the video stream? 
    if(packet.stream_index==0) 
    { 
     int res = avcodec_decode_video2(codecCtx, srcFrame, &frameFinished, &packet); 
     NSLog(@"Res value===>%d",res); 
     NSLog(@"frame data===>%d",(int)srcFrame->data); 
     if (res < 0) 
     { 
      NSLog(@"Failed to decode frame"); 
     } 
    } 
    else 
    { 
     NSLog(@"No video stream found"); 
    } 


    // Need to delay initializing the output buffers because we don't know the dimensions until we decode the first frame. 
    if (!outputInit) { 
     if (codecCtx->width > 0 && codecCtx->height > 0) { 
#ifdef _DEBUG 
      NSLog(@"Initializing decoder with frame size of: %dx%d", codecCtx->width, codecCtx->height); 
#endif 

      outputBufLen = avpicture_get_size(PIX_FMT_RGBA, codecCtx->width, codecCtx->height); 
      outputBuf = av_malloc(outputBufLen); 

      avpicture_fill((AVPicture*)dstFrame, outputBuf, PIX_FMT_RGBA, codecCtx->width, codecCtx->height); 

      convertCtx = sws_getContext(codecCtx->width, codecCtx->height, codecCtx->pix_fmt, codecCtx->width, 
             codecCtx->height, PIX_FMT_RGBA, SWS_FAST_BILINEAR, NULL, NULL, NULL); 

      outputInit = YES; 
      frameFinished=1; 
     } 
     else { 
      NSLog(@"Could not get video output dimensions"); 
     } 
    } 

    if (frameFinished) 
     frameReady = YES; 

} 

La console me montre comme suit.

2011-05-16 20:16:04.223 RTSPTest1[41226:207] Packet size===>359 
[h264 @ 0x5815c00] no frame! 
2011-05-16 20:16:04.223 RTSPTest1[41226:207] Res value===>-1 
2011-05-16 20:16:04.224 RTSPTest1[41226:207] frame data===>101791200 
2011-05-16 20:16:04.224 RTSPTest1[41226:207] Failed to decode frame 
2011-05-16 20:16:04.225 RTSPTest1[41226:207] decoded! 
2011-05-16 20:16:04.226 RTSPTest1[41226:207] Packet size===>424 
[h264 @ 0x5017c00] no frame! 
2011-05-16 20:16:04.226 RTSPTest1[41226:207] Res value===>-1 
2011-05-16 20:16:04.227 RTSPTest1[41226:207] frame data===>81002704 
2011-05-16 20:16:04.227 RTSPTest1[41226:207] Failed to decode frame 
2011-05-16 20:16:04.228 RTSPTest1[41226:207] decoded! 
2011-05-16 20:16:04.229 RTSPTest1[41226:207] Packet size===>424 
[h264 @ 0x581d000] no frame! 
2011-05-16 20:16:04.229 RTSPTest1[41226:207] Res value===>-1 
2011-05-16 20:16:04.230 RTSPTest1[41226:207] frame data===>101791616 
2011-05-16 20:16:04.230 RTSPTest1[41226:207] Failed to decode frame 
2011-05-16 20:16:04.231 RTSPTest1[41226:207] decoded! 
. . . . . 

Mais le simulateur ne montre rien.

Quel est le problème avec mon code.

Aidez-moi à résoudre ce problème.

Merci pour vos réponses.

Répondre

3

J'ai eu un problème similaire avec H264 et FFmpeg. Mon problème était que certains périphériques n'envoyaient pas la séquence (SPS) et les jeux de paramètres d'image (PPS) avec chaque trame, j'ai donc dû modifier légèrement mes données de trame.

Peut-être que cet article vous aidera: FFmpeg can't decode H264 stream/frame data

Questions connexes