⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x264.c

📁 linux下编译已经通过
💻 C
📖 第 1 页 / 共 3 页
字号:
        {            const char *name = long_options_index > 0 ? long_options[long_options_index].name : argv[optind-2];            fprintf( stderr, "x264 [error]: invalid argument: %s = %s\n", name, optarg );            return -1;        }    }    /* Get the file name */    if( optind > argc - 1 || !opt->hout )    {        fprintf( stderr, "x264 [error]: No %s file. Run x264 --help for a list of options.\n",                 optind > argc - 1 ? "input" : "output" );        return -1;    }    psz_filename = argv[optind++];    /* check demuxer type */    psz = psz_filename + strlen(psz_filename) - 1;    while( psz > psz_filename && *psz != '.' )        psz--;    if( !strncasecmp( psz, ".avi", 4 ) || !strncasecmp( psz, ".avs", 4 ) )        b_avis = 1;    if( !strncasecmp( psz, ".y4m", 4 ) )        b_y4m = 1;    if( !(b_avis || b_y4m) ) // raw yuv    {        if( optind > argc - 1 )        {            /* try to parse the file name */            for( psz = psz_filename; *psz; psz++ )            {                if( *psz >= '0' && *psz <= '9'                    && sscanf( psz, "%ux%u", &param->i_width, &param->i_height ) == 2 )                {                    if( param->i_log_level >= X264_LOG_INFO )                        fprintf( stderr, "x264 [info]: file name gives %dx%d\n", param->i_width, param->i_height );                    break;                }            }        }        else        {            sscanf( argv[optind++], "%ux%u", &param->i_width, &param->i_height );        }    }            if( !(b_avis || b_y4m) && ( !param->i_width || !param->i_height ) )    {        fprintf( stderr, "x264 [error]: Rawyuv input requires a resolution.\n" );        return -1;    }    /* open the input */    {        if( b_avis )        {#ifdef AVIS_INPUT            p_open_infile = open_file_avis;            p_get_frame_total = get_frame_total_avis;            p_read_frame = read_frame_avis;            p_close_infile = close_file_avis;#else            fprintf( stderr, "x264 [error]: not compiled with AVIS input support\n" );            return -1;#endif        }        if ( b_y4m )        {            p_open_infile = open_file_y4m;            p_get_frame_total = get_frame_total_y4m;            p_read_frame = read_frame_y4m;            p_close_infile = close_file_y4m;        }        if( p_open_infile( psz_filename, &opt->hin, param ) )        {            fprintf( stderr, "x264 [error]: could not open input file '%s'\n", psz_filename );            return -1;        }    }#ifdef HAVE_PTHREAD    if( b_thread_input || param->i_threads > 1 )    {        if( open_file_thread( NULL, &opt->hin, param ) )        {            fprintf( stderr, "x264 [warning]: threaded input failed\n" );        }        else        {            p_open_infile = open_file_thread;            p_get_frame_total = get_frame_total_thread;            p_read_frame = read_frame_thread;            p_close_infile = close_file_thread;        }    }#endif    return 0;}static void parse_qpfile( cli_opt_t *opt, x264_picture_t *pic, int i_frame ){    int num = -1, qp;    char type;    while( num < i_frame )    {        int ret = fscanf( opt->qpfile, "%d %c %d\n", &num, &type, &qp );        if( num < i_frame )            continue;        pic->i_qpplus1 = qp+1;        if     ( type == 'I' ) pic->i_type = X264_TYPE_IDR;        else if( type == 'i' ) pic->i_type = X264_TYPE_I;        else if( type == 'P' ) pic->i_type = X264_TYPE_P;        else if( type == 'B' ) pic->i_type = X264_TYPE_BREF;        else if( type == 'b' ) pic->i_type = X264_TYPE_B;        else ret = 0;        if( ret != 3 || qp < 0 || qp > 51 || num > i_frame )        {            fprintf( stderr, "x264 [error]: can't parse qpfile for frame %d\n", i_frame );            fclose( opt->qpfile );            opt->qpfile = NULL;            pic->i_type = X264_TYPE_AUTO;            pic->i_qpplus1 = 0;            break;        }    }}/***************************************************************************** * Encode: *****************************************************************************/static int  Encode_frame( x264_t *h, hnd_t hout, x264_picture_t *pic ){    x264_picture_t pic_out;    x264_nal_t *nal;    int i_nal, i;    int i_file = 0;    if( x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out ) < 0 )    {        fprintf( stderr, "x264 [error]: x264_encoder_encode failed\n" );    }    for( i = 0; i < i_nal; i++ )    {        int i_size;        if( mux_buffer_size < nal[i].i_payload * 3/2 + 4 )        {            mux_buffer_size = nal[i].i_payload * 2 + 4;            x264_free( mux_buffer );            mux_buffer = x264_malloc( mux_buffer_size );        }        i_size = mux_buffer_size;        x264_nal_encode( mux_buffer, &i_size, 1, &nal[i] );        i_file += p_write_nalu( hout, mux_buffer, i_size );    }    if (i_nal)        p_set_eop( hout, &pic_out );    return i_file;}static int  Encode( x264_param_t *param, cli_opt_t *opt ){    x264_t *h;    x264_picture_t pic;    int     i_frame, i_frame_total;    int64_t i_start, i_end;    int64_t i_file;    int     i_frame_size;    int     i_progress;    int	    i_size;    i_frame_total = p_get_frame_total( opt->hin );    printf("Total %d Frame i_seek %d \n", i_frame_total, opt->i_seek);    i_frame_total -= opt->i_seek;        if( ( i_frame_total == 0 || param->i_frame_total < i_frame_total )        && param->i_frame_total > 0 )        i_frame_total = param->i_frame_total;    param->i_frame_total = i_frame_total;    if( ( h = x264_encoder_open( param ) ) == NULL )    {        fprintf( stderr, "x264 [error]: x264_encoder_open failed\n" );        p_close_infile( opt->hin );        p_close_outfile( opt->hout );        return -1;    }    if( p_set_outfile_param( opt->hout, param ) )    {        fprintf( stderr, "x264 [error]: can't set outfile param\n" );        p_close_infile( opt->hin );        p_close_outfile( opt->hout );        return -1;    }    /* Create a new pic */    x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height );    i_start = x264_mdate();    /* Encode frames */    for( i_frame = 0, i_file = 0, i_progress = 0;         b_ctrl_c == 0 && (i_frame < i_frame_total || i_frame_total == 0); )    {        if( p_read_frame( &pic, opt->hin, i_frame + opt->i_seek ) )            break;        pic.i_pts = (int64_t)i_frame * param->i_fps_den;        if( opt->qpfile )            parse_qpfile( opt, &pic, i_frame + opt->i_seek );        else        {            /* Do not force any parameters */            pic.i_type = X264_TYPE_AUTO;            pic.i_qpplus1 = 0;        }		i_size = Encode_frame( h, opt->hout, &pic );        i_file += i_size;        printf("Frame [%d] size %d \n", i_frame, (int)i_size);        i_frame++;        /* update status line (up to 1000 times per input file) */        if( opt->b_progress && param->i_log_level < X264_LOG_DEBUG &&             ( i_frame_total ? i_frame * 1000 / i_frame_total > i_progress                            : i_frame % 10 == 0 ) )        {            int64_t i_elapsed = x264_mdate() - i_start;            double fps = i_elapsed > 0 ? i_frame * 1000000. / i_elapsed : 0;            if( i_frame_total )            {                int eta = i_elapsed * (i_frame_total - i_frame) / ((int64_t)i_frame * 1000000);                i_progress = i_frame * 1000 / i_frame_total;                fprintf( stderr, "encoded frames: %d/%d (%.1f%%), %.2f fps, eta %d:%02d:%02d  \r",                         i_frame, i_frame_total, (float)i_progress / 10, fps,                         eta/3600, (eta/60)%60, eta%60 );            }            else                fprintf( stderr, "encoded frames: %d, %.2f fps   \r", i_frame, fps );            fflush( stderr ); // needed in windows        }    }    /* Flush delayed B-frames */    do {        i_file +=        i_frame_size = Encode_frame( h, opt->hout, NULL );        printf("i_frame_size %d\n", i_frame_size);    } while( i_frame_size );    i_end = x264_mdate();    x264_picture_clean( &pic );    x264_encoder_close( h );    fprintf( stderr, "\n" );    if( b_ctrl_c )        fprintf( stderr, "aborted at input frame %d\n", opt->i_seek + i_frame );    p_close_infile( opt->hin );    p_close_outfile( opt->hout );    if( i_frame > 0 )    {        double fps = (double)i_frame * (double)1000000 /                     (double)( i_end - i_start );        fprintf( stderr, "encoded %d frames, %.2f fps, %.2f kb/s\n", i_frame, fps,                 (double) i_file * 8 * param->i_fps_num /                 ( (double) param->i_fps_den * i_frame * 1000 ) );    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -