2011-05-16 23 views
5

h264 akışını rtsp sunucusundan çözmeyi ve iPhone'da oluşturmayı deniyorum.FFmpeg, h264 akışını çözmez

Bazı kitaplıklar buldum ve bu konuda bazı makaleler okuyun.

Kütüphaneler, RTSPClient ve DecoderWrapper adlı iPhone için dropCam'den alınmıştır.

Ancak çerçeve verilerini DecodeWrapper ile çözemiyorum.

İşte kodum.

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; 

} 

Konsol, aşağıdaki gibi gösterir.

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

Ancak simülatör hiçbir şey göstermiyor.

Kodumdaki sorun nedir?

Bu sorunu çözmeme yardımcı olun.

Yanıtlarınız için teşekkürler.

cevap

3

H264 ve FFmpeg ile benzer bir sorun yaşadım. Sorunum, bazı aygıtların her bir karede sekansı (SPS) ve resim parametre setlerini (PPS) göndermemesiydi, bu yüzden çerçeve verilerimi biraz değiştirmem gerekiyordu.

Belki bu gönderi size yardımcı olacaktır: FFmpeg can't decode H264 stream/frame data

İlgili konular