利用ffmpeg来进行视频解码的完整示例代码(H.264)

来源:互联网 发布:flash cs6 mac 破解版 编辑:程序博客网 时间:2024/04/30 12:31
Decode() 
    { 
    FILE * inpf; 
     
    int nWrite; 
    int i,p; 
    int nalLen; 
    unsigned char* Buf; 
    int got_picture, consumed_bytes; 
    unsigned char *DisplayBuf; 
    DisplayBuf=(unsigned char *)malloc(60000); 
     
    char outfile[] = "test.pgm"; 
     
    //1.打开输入文件 
    inpf = fopen("test.264", "rb"); 
     
    //outf = fopen("out.yuv", "wb"); 
     
    if(!inpf) 
    { 
    goto Decodereturn; 
    } 
     
    nalLen = 0; 
    Buf = (unsigned char*)calloc ( 1000000, sizeof(char)); //准备解码文件缓冲 
     
    //2.注册解码器,并且找到H264解码器 
    avcodec_init(); 
    avcodec_register_all(); 
    codec = avcodec_find_decoder(CODEC_ID_H264); 
     
    if (!codec) { 
    return 0; 
    } 
    //allocate codec context 
    //分配解码器内存 
    c = avcodec_alloc_context(); 
     
    if(!c){ 
    return 0; 
    } 
    //open codec 
    //3.打开解码器 
    if (avcodec_open(c, codec) < 0) { 
    return 0; 
    } 
     
    //allocate frame buffer 
    //分配解码器用的帧缓冲 
    picture = avcodec_alloc_frame(); 
    if(!picture){ 
    return 0; 
    } 
     
    rgbdatanew = (unsigned char *)malloc(sizeof(unsigned char)*(3 * width * height)); 
     
    while(!feof(inpf)) 
    { 
     
    //4.获取下一个NAL的长度,并且将NAL放入Buf 
    nalLen = getNextNal(inpf, Buf); 
     
    //5.对改NAL解码,解码的YUV数据存在picture中 
    consumed_bytes= avcodec_decode_video(c, picture, &got_picture, Buf, nalLen); 
     
    if(consumed_bytes > 0) 
    { 
     
    //6.将picture中的YUV数据显示或者保存到文件 
    p=0; 
    for(i=0; i<c->height; i++) 
    { 
    memcpy(DisplayBuf+p,picture->data[0] + i * picture->linesize[0], c->width); 
    p+=c->width; 
    } 
    for(i=0; i<c->height/2; i++) 
    { 
    memcpy(DisplayBuf+p,picture->data[1] + i * picture->linesize[1], c->width/2); 
    p+=c->width/2; 
    } 
    for(i=0; i<c->height/2; i++) 
    { 
    memcpy(DisplayBuf+p,picture->data[2] + i * picture->linesize[2], c->width/2); 
    p+=c->width/2; 
    } 
    //显示画面 
    DisplayVideo(DisplayBuf); 
    } 
    } 
     
    //7.关闭输入文件 
    if(inpf) 
    fclose(inpf); 
     
    Decodereturn: 
     
    //8.关闭解码器,释放解码器内存 
    if(c) { 
    avcodec_close(c); 
    av_free(c); 
    c = NULL; 
    } 
    //9.释放解码画面内存 
    if(picture) { 
    av_free(picture); 
    picture = NULL; 
    } 
     
    //10.释放解码文件缓冲 
    if(Buf) 
    { 
    free(Buf); 
    Buf = NULL; 
    } 
     
    free(DisplayBuf); 
    } 
原创粉丝点击