настройки без потерь h264 в c

В настоящее время я пытаюсь применить настройки H264 без потерь для FFMPEG в c. Однако я не уверен, какими должны быть настройки для обеспечения кодирования без потерь, и я нашел мало документации в этой области.

Мои текущие настройки:

    codecContex->coder_type = 1; 
    codecContex->flags|=CODEC_FLAG_LOOP_FILTER;
    codecContex->flags2|=CODEC_FLAG2_BPYRAMID-CODEC_FLAG2_WPRED-CODEC_FLAG2_8X8DCT;

    codecContex->profile=FF_PROFILE_H264_BASELINE;
    codecContex->scenechange_threshold = 40; 
    codecContex->gop_size=40;
    codecContex->max_b_frames=0;
    codecContex->max_qdiff=4;
    codecContex->me_method=10;
    codecContex->me_range=16;
    codecContex->me_cmp|= 1;
    codecContex->me_subpel_quality = 5; 
    codecContex->qmin=0; 
    codecContex->qmax=0;
    codecContex->qcompress=0.6f;
    codecContex->keyint_min=25;
    codecContex->trellis=0;
    codecContex->level=13;
    codecContex->refs = 16;
    codecContex->weighted_p_pred = 2;
    codecContex->b_frame_strategy= 1;
    codecContex->color_range = libffmpeg::AVCOL_RANGE_JPEG;
    codecContex->coder_type = FF_CODER_TYPE_AC;
    codecContex->crf = 0;

Любые идеи относительно того, какими они должны быть для обеспечения кодирования без потерь? Заранее спасибо.


person Squid    schedule 25.02.2014    source источник


Ответы (1)


Попробуй это:

...
AVDictionary *param;
av_dict_set(&param, "qp", "0", 0);
/*
Change options to trade off compression efficiency against encoding speed. If you specify a preset, the changes it makes will be applied before all other parameters are applied.
You should generally set this option to the slowest you can bear.
Values available: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo.
*/
av_dict_set(&param, "preset", "medium", 0);
/*
Tune options to further optimize them for your input content. If you specify a tuning, the changes will be applied after --preset but before all other parameters.
If your source content matches one of the available tunings you can use this, otherwise leave unset.
Values available: film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency.
*/
av_dict_set(&param, "tune", "film", 0);
int rt = avcodec_open2(codecContext, codec, &param);
...

Для без потерь не используйте профиль

person luca    schedule 26.02.2014
comment
Привет, Лука, я попробовал этот метод, однако теперь, когда я запускаю свой код C #, используя DLL, созданную этим кодом, я могу получить ошибку AccessViolationUnhandled с сообщением о попытке чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена. Я не совсем уверен, что вызывает это, есть идеи? - person Squid; 03.03.2014
comment
извините, вы пытались установить параметр = 0? потому что av_dict_set выделяет память, если параметр = 0, но если нет, он думает, что память выделена - person luca; 03.03.2014
comment
Привет, Лука! Большое спасибо за помощь! Теперь я могу собрать и запустить код, но, к сожалению, он по-прежнему не кодируется без потерь, поскольку, когда я декодирую файл, он меньше ожидаемого (обычно примерно на 25 МБ). - person Squid; 05.03.2014
comment
Извините, действительно похоже, что сжатие работает, проблема в другом, связана с записью кадров в файл. Спасибо большое за помощь! - person Squid; 05.03.2014