2011-05-16 236 views
5

我試圖從rtsp服務器解碼h264流並在iPhone上呈現它。FFmpeg不解碼h264流

我找到了一些圖書館並閱讀了一些關於它的文章。

圖書館來自iPhone的dropCam,名爲RTSPClient和DecoderWrapper。

但我不能用DecodeWrapper在ffmpeg上解碼幀數據。

這是我的代碼。

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; 

} 

控制檯顯示如下。

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! 
. . . . . 

但模擬器什麼都沒顯示。

我的代碼有什麼問題。

幫我解決這個問題。

感謝您的回答。

回答

3

我有類似的問題H264和FFmpeg。 我的問題是,有些設備沒有發送序列(SPS)和圖片參數集(PPS)與每一幀,所以我需要稍微修改我的幀數據。

也許這個職位對我有用:FFmpeg can't decode H264 stream/frame data