2014年12月5日金曜日

RaspberryPiでMpeg2→Mpeg4へトランスコードする・続2


前回の続き、
http://ivis-mynikki.blogspot.jp/2014/11/rasberry-pimpeg2mpeg4.html

omxtxをmakeするとき、ライブラリが足りないものはaptitudeで調べて ***-devをインストール。
リンカエラーが出たら LIBS=-lavcodec など追加していくとビルドが通る。

テストデータをMP4化してみてchromebookで再生できるかと思ったら再生できなかったが、
出来上がったMP4動画ファイルに音声ファイルを結合すると再生できた。
でも画質が悪い。一昔のVHS映像並。なんでだろう。


ビットレートの設定が反映されてないような気がするので
ソースを見てみる。

まずはMain関数から。
引数を展開して、Init処理から始まる。
 
動画ファイルをオープンして、
 vidindex = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -1, -1,
                NULL, 0);


Mpeg2デコード、Mpeg4エンコード、リサイズ設定して、、
        bcm_host_init();
        OERR(OMX_Init(), ctx.verbose);
        OERR(OMX_GetHandle(&m2, DECNAME, &ctx, &decevents), ctx.verbose);
        OERR(OMX_GetHandle(&m4, ENCNAME, &ctx, &encevents), ctx.verbose);
        OERR(OMX_GetHandle(&resize, RESIZENAME, &ctx, &resizeevents), ctx.verbose);


OpenMAXにパラメータ送信して、
         OERR(OMX_GetParameter(m2, OMX_IndexParamVideoInit, porttype), ctx.verbose);
        if (ctx.verbose) printf("Found %d ports, starting at %d (%x) on decoder\n",
                porttype->nPorts, porttype->nStartPortNumber,
                porttype->nStartPortNumber);
        ctx.decportidx = decportidx = porttype->nStartPortNumber;

        OERR(OMX_GetParameter(resize, OMX_IndexParamImageInit, porttype), ctx.verbose);
        if (ctx.verbose) printf("Found %d ports, starting at %d (%x) on resizer\n",
                porttype->nPorts, porttype->nStartPortNumber,
                porttype->nStartPortNumber);
        ctx.resizeportidx = resizeportidx = porttype->nStartPortNumber;

        OERR(OMX_GetParameter(m4, OMX_IndexParamVideoInit, porttype), ctx.verbose);
        if (ctx.verbose) printf("Found %d ports, starting at %d (%x) on encoder\n",
                porttype->nPorts, porttype->nStartPortNumber,
                porttype->nStartPortNumber);
        ctx.encportidx = encportidx = porttype->nStartPortNumber;
        free(porttype);

        OERR(OMX_SendCommand(m2, OMX_CommandPortDisable, decportidx, NULL), ctx.verbose);
        OERR(OMX_SendCommand(m2, OMX_CommandPortDisable, decportidx+1, NULL), ctx.verbose);
        OERR(OMX_SendCommand(resize, OMX_CommandPortDisable, resizeportidx, NULL), ctx.verbose);
        OERR(OMX_SendCommand(resize, OMX_CommandPortDisable, resizeportidx+1, NULL), ctx.verbose);
        OERR(OMX_SendCommand(m4, OMX_CommandPortDisable, encportidx, NULL), ctx.verbose);
        OERR(OMX_SendCommand(m4, OMX_CommandPortDisable, encportidx+1, NULL), ctx.verbose);


処理開始。
    OERR(OMX_SendCommand(m2, OMX_CommandStateSet, OMX_StateExecuting, NULL), ctx.verbose);

ビットレートの設定が無いなって思ったら、実行処理の中にある
DECTUNNELSETUP内のconfigure関数で行っているようだった。

これであってるのか分からないが。。
1つ気づいたのはデインターレース処理が入ってないなって思ったので、
対応したomxtxが調べてみたらありました。

Dickon hood氏が2013年に対応してくださっていたようだ。
 * (c) 2012, 2013 Dickon Hood
 * Timing fixups by Adam Charrett
 *
 * A trivial OpenMAX transcoder for the Pi.
 *
 * Very much a work-in-progress, and as such is noisy, doesn't produce
 * particularly pretty output, and is probably buggier than a swamp in
 * summer.  Beware of memory leaks.
 *
 * Usage: ./omxtx [-b bitrate] [-r size] [-x] [-d] [-m] input.foo output.mp4


でも今ビルドしたものはArjen氏が改造したもの。
 * (c) 2012 Dickon Hood
 * modified dec 2012 by Arjen V
 * Added resizer functionality
 * Added pixelaspectratio (hardware)
 *
 * A trivial OpenMAX transcoder for the Pi.
 *
 * Very much a work-in-progress, and as such is noisy, doesn't produce
 * particularly pretty output, and is probably buggier than a swamp in
 * summer.  Beware of memory leaks.
 *
 * Usage: ./omxtx [-v] [-b bitrate] [-s WxH] input.foo output.m4v


追加内容を見ると、
<Deckon氏>
    pixaspect->nPortIndex = PORT_ENC+1;
    pixaspect->nX = 64;
    pixaspect->nY = 45;
//    OERR(OMX_SetParameter(dec, OMX_IndexParamBrcmPixelAspectRatio, pixaspect));


 <Arien氏>
       pixaspect->nPortIndex = encportidx+1;
        pixaspect->nX = 118;
        pixaspect->nY = 81;
        OERR(OMX_SetConfig(m4, OMX_IndexParamBrcmPixelAspectRatio, pixaspect), ctx->verbose);
        free(pixaspect);


 少し設定値が違うようだけど、Deckon氏の早く気づいておけばよかった。。

今日はここまで。


次回は最新版のomxtxでビットレートの設定が正しくなっているか、

またはデコード・エンコードの仕方を見直し?を行う。




コメントを投稿

Androider