SSブログ

Nvidia Video Codec SDK7.1のNvTranscoderをいじる [プログラミング]

NVENCのお勉強の一環として、NvTranscoderをいじっている。元はH.264をH.264とかHEVCに変換するものなんだけど、実はmpeg2も大した改変もなくHEVCとかに変換できた。たぶんNVDECがサポートしているコーデックならみな対応しているんじゃないかなと思う。対応しているんだけど、入力時にH.264しか入れないようになっているので、そこを取り去ってさえすればそのまますんなりトランスエンコードされる。

具体的にはVideoDecoder.cppの114行目

if (oFormat.codec != cudaVideoCodec_H264 && oFormat.codec != cudaVideoCodec_HEVC) {
fprintf(stderr, "The sample only supports H264/HEVC input video!\n");
exit(-1);
}
というところをコメントアウトするだけでいい。ここでいらないチェックをしているから、途中で止まる。少なくとも付属しているplush1_720p_10s.m2vをHEVCにエンコードできたようだ。ただ、今までと同じようにmp4のコンテナに乗っている状態ではないので、そこは別途インプリしないといけない。とりあえずHandbrakeからソースを取ってきて組み入れてみようと思う。

ん〜mpegは結構画像が荒れるな。ブロックノイズどころの話じゃない感じ。VLCとかは細かいブレをチューニングして作られていることが分かる。VOBファイルは途中でエラーが出る。まぁそうだろうね。どちらにしてもMP4化は必須なのでやらないと。

MUX部分だけHandbrakeから持ってこようとしたけど、他のヘッダや何かがかなり入り組んでいて、それだけ抽出するわけには行かなかった。関数だけ引き出すことはできるのだろうけど、それでもHandbrake由来の型が沢山あると思うので、簡単に移植できそうにない。これはHandbrakeにTranscodeのソースを持ち込む方が楽できるかなと思ったり。それにはTranscode側の訳のわかってないところを読み込まないと。もうちっと粘度が低いと思っていたけど、Handbrake自体がかなり色々なものを取り込んでいる上に全体的にはモノリシックな構造になっている。

ってかモノシリックだと今まで思っていた。モノリシックね。lithic自体が岩石関係の言葉でmonoがついているから一枚岩的な意味らしい。日本語の読みやすさで日本語英語ができることって多いよな。シミュレーションがシュミレーションとか、あまりによくありがち。雰囲気をふいんきと読んだりするのも同じだろうなぁ。あまりに頻発するので訂正する気にもならない。まぁ意味が相手に正確に伝わればいいとは思うけど気になる人は気になるだろうな。

そんなわけでmp4boxとか組み入れるなり、外から使うなりしてちょっとやってみたい。その前にHandbrakeに突入しちゃうかもなぁ。cppファイルをそのまま使ってextern"C"して使うか、スクラッチしてC言語のNvEncで始まるAPIを素で使うか、どっちが早くて確実かなぁ。内容をはっきりと理解しなくていいのは.cppファイルのまま渡す方法なんだろうけど、それだと何だかわからないが動く状態になりかねないし、それはそれでいいかなと思う自分がいたりする。目的はHandbrakeを理解することじゃなく、NVENCを使うことなので。しかし、Handbrake久しぶりだな。ちょっとソースが懐かしいとともにQSV関係のソースが加わっていたりする。」

タグ:NVENC
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0