2016-10-14 6 views
0

ffmpegのコードでpsnrフィルタを使用する方法を知りたいだけです。ffmpegへのリファレンスムービーの追加方法psnrフィルタのコード(コンピューティングpsnr)

sprintf(args, "movie=ref_movie.avi [main];[main][ref] psnr=\"stats_file=stats.log\" [out]"); 
err = avfilter_graph_create_filter(&psnrCtx, psnrFilter, "psnr", args, NULL, m_filterGraph); 
if (err < 0) { 
    avfilter_graph_free(&m_filterGraph); 
    m_filterGraph = NULL; 
    return false; } 

しかし、エラー・メッセージ・リターン私に:

Option 'movie' not found

私もこれを試してみてください。

が、私はコードがhttps://ffmpeg.org/ffmpeg-filters.html#psnrに述べ続いている

sprintf(args, "stats_file=stats.log"); 
err = avfilter_graph_create_filter(&psnrCtx, psnrFilter, "psnr", args, NULL, m_filterGraph); 
if (err < 0) { 
    avfilter_graph_free(&m_filterGraph); 
    m_filterGraph = NULL; 
    return false; } 
err = avfilter_link(last_ctx, 0, psnrCtx, 0); 
if (err < 0) { 
    avfilter_graph_free(&m_filterGraph); 
    m_filterGraph = NULL; 
    return false;} 

... 
err = avfilter_graph_config(m_filterGraph, NULL); 
if (err < 0) { 
    avfilter_graph_free(&m_filterGraph); 
    m_filterGraph = NULL; 
    return false; 
} 

が、エラーメッセージが返されます:

Input pad "reference" with type video of the filter instance "psnr" of psnr not connected to any source 

私はpsnrフィルタでコードを検索しますが、それに関する情報はあまりありません。誰もこれを助けることができますか?

答えて

3

avfilter_graph_create_filter()を使用して、フィルタの代わりにフィルタグラフを作成しています。代わりにavfilter_graph_parse2()を使用して、フィルタグラフ全体を作成します。

フィルタグラフは、ffmpegコマンドラインで-filter_complexに入力したものと同じです。あなたは映画の要素を取得するための入力として使用したいものを文字列のこの例に例を参照してください:

ffmpeg -filter_complex 'movie=file.mpg[in];movie=ref.mpg[ref];[in][ref]psnr[out]' -map '[out]' -f null - 

は、そうでない場合は、ムービーの要素が登録されることはありません、あなたのフィルタグラフを解析する前にavfilter_register_all()av_register_all()を呼び出すことを忘れないでください。まだ。

例コードの完全な部分:

#include <assert.h> 

#include "libavcodec/avcodec.h" 
#include "libavfilter/avfilter.h" 
#include "libavfilter/buffersink.h" 
#include "libavformat/avformat.h" 

int main() { 
    AVFilterGraph *filter_graph; 
    AVFilterInOut *inputs = NULL, *outputs = NULL; 
    AVFilterContext *buffersink_ctx; 
    AVFrame *f; 

    avfilter_register_all(); 
    av_register_all(); 

    filter_graph = avfilter_graph_alloc(); 
    int ret; 

    ret = avfilter_graph_parse2(filter_graph, 
           "movie=file.mpg[in];" 
           "movie=ref.mpg[ref];" 
           "[in][ref]psnr[out];" 
           "[out]buffersink", 
           &inputs, &outputs); 
    if (ret < 0) return ret; 
    ret = avfilter_graph_config(filter_graph, NULL); 
    if (ret < 0) return ret; 
    buffersink_ctx = avfilter_graph_get_filter(filter_graph, "Parsed_buffersink_3"); 
    assert(buffersink_ctx != NULL); 
    f = av_frame_alloc(); 

    for (;;) { 
     ret = av_buffersink_get_frame(buffersink_ctx, f); 
     if (ret < 0) break; 
     av_frame_unref(f); 
    } 

    av_frame_free(&f); 
    avfilter_graph_free(&filter_graph); 

    return 0; 
} 

ループ内fからフレームごとのPSN値を抽出するためには、このようなものを使用します。その最終的な値を取得する

static void parse_psnr(AVFrame *f) { 
    AVDictionary *metadata = av_frame_get_metadata(f); 
    float psnr[4]; 

#define parse(a, b) \ 
    sscanf(av_dict_get(metadata, a, NULL, 0)->value, "%f", &b) 

    parse("lavfi.psnr.psnr.y", psnr[0]); 
    parse("lavfi.psnr.psnr.u", psnr[1]); 
    parse("lavfi.psnr.psnr.v", psnr[2]); 
    parse("lavfi.psnr.psnr_avg", psnr[3]); 

} 

をstdout(シーケンス全体のPSNR)に出力される場合は、av_log_set_callback()を使用してログコールバックを設定し、文字列を適切に解析することができます。

+0

ご回答いただきありがとうございます。私が伺いたいことは、PSIMのlavfi.psnr.psnr.yと同じように、SSIMについて何かを選択することです。 – user1317278

+0

lavfi.ssim.dB.Y、lavfi。 ssim.dB.U、lavfi.ssim.dB.Vおよびlavfi.ssim.dB –

関連する問題