前回の続き、
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でビットレートの設定が正しくなっているか、
またはデコード・エンコードの仕方を見直し?を行う。
0 件のコメント:
コメントを投稿