仕事でプログラムからH.264形式のファイル出力が必要になりそうなので
簡単に組み込めそうなやつあるか調べたらIntel Media SDKが扱い易そうかなと
普通は上記を利用する目的がハードウェア支援エンコードなんでしょうが
ソースコードライセンスが扱いやすいH.264エンコーダーが欲しいだけ
とりあえず公式から
Intel® Media SDK 2014 for Clients
をダウンロード
#楽なのはffmpegからlibx264を使う方法ですがライセンスがGPLで面倒
サンプルが色々あるのでH.264のエンコードができそうなやつを探し
一番小さそうな
Video Encoding Sample
をダウンロード
環境変数をセットするためかインストーラで適当な場所に展開
まずはこのサンプルで動きを確認してみる
Visual Studio 2005のプロジェクトが付属してるので開くと
Win32/x64両方のプラットフォームがあったのでx64でビルド
2012でビルドしたが特にエラーもなく完了٩( 'ω' )و
出来上がったsample_encode.exeの使い方を見ると
Usage: sample_encode.exe <msdk-codecid> [<options>] -i InputYUVFile -o OutputEncodedFile -w width -h height
ということで入力がYUVファイルである必要があるようだ
さて、適当な動画を単体のYUVファイルにするにはどうすればよいかな
まぁffmpegあたりで出来るかなと調べてみると以下でOK
ffmpeg.exe -i inputfile output.yuv
非圧縮のYUV420なのでHDサイズだと10秒くらいでも1GBに膨れる
とりあえず適当に切って414フレーム分で1.19GBであった
これをフレームレートとビットレートを適当に指定して下記で実行
インターレース素材なのでtop field firstも指定
sample_encode.exe h264 -i input.yuv -o output.264 - f 29.97 -w 1920 -h 1080 -b 15000 -tff
コマンドプロンプトに情報が出て実行中はフレーム数が更新されていく
Intel(R) Media SDK Encoding Sample Version 5.0.461.92695
Input file format YUV420
Output video AVC
Source picture:
Resolution 1920x1088
Crop X,Y,W,H 0,0,1920,1080
Destination picture:
Resolution 1920x1088
Crop X,Y,W,H 0,0,1920,1080
Frame rate 29.97
Bit rate(Kbps) 15000
Target usage balanced
Memory type system
Media SDK impl sw
Media SDK version 1.9
Processing started
Frame number: 1
エンコード中は複数CPUをしっかり100%近くまで使ってくれている
出力されたH.264データをTMPGEncで読んで画を確認したところ問題なさそう
#普通に再生するにはffmpegとかでmp4コンテナ等に入れる必要があるだろう
ソースコードはそれほど複雑でもなく入出力部分で切り離されてるので
ファイルIO部分を弄れば割と簡単に組み込んで使えそう
ここからはオマケですが上記のオプション指定だとソフトウェアエンコードである
Media SDK impl sw
ハードウェア支援によるエンコード(-hwオプション)がどれほど高速か試してみよう
注意としては内蔵GPUを有効にして且つ出力が有効である必要があるとのこと
デスクトップ機は別途NVIDIAのビデオカードを使ってたのでHaswellノートで試した
■CPU
Core i7-4500U (SONY VAIO Pro 11)
■ソース
フレーム数414、1920x1080、YUV420
■エンコード設定
1920x1080/29.97、15Mbps、Top Field First
■結果
SWエンコード:40秒くらい
HWエンコード:5秒くらい
HWはえーな∑(゚Д゚)
速すぎてディスクが足を引っ張ってるかもしれん(SSDだけど)
HWエンコード中のCPU使用率は30~40%程度とかなり低い
ただしソフトウェアの方がエンコード結果が綺麗なのは仕方ないところか
コンサート映像のライティングなどグラデーション部分は明白に差が出る
左がハードウェア、右がソフトウェア
この辺はビットレート等の設定次第だろうけど(´ε` )
---
追記
以下のSWエンコード用のDLLは自プログラムと一緒にパッケージングしたいところ
x86用 : libmfxsw32.dll
x64用 : libmfxsw64.dll
それぞれMedia SDK Clientのインストールフォルダ内にあります
これらのライセンスを見ると製品にバイナリを付属して配布OKとあるので問題なしです
なお、HWエンコード用のはドライバインストール時に入っているはずです