前提・実現したいこと
FFmpegのAPIを自作のC# アプリから利用したいと考えています。
そのままWindows向けにビルドされたFFmpegのDLLをC#側から直接参照するのは(マーシャリング周りの)勝手がよくないので、利用するFFmpegの処理だけをまとめてC++で書いてDLL化してしまい、そこをC#側から叩くという方針です。
<C#アプリ> - <C++ DLL> - <FFmpeg API DLL>
のようなイメージです。
発生している問題・エラーメッセージ
こちらを参考に進めました。
さて、まずはWindows向けにビルドされたFFmpegの.dllや.libやヘッダファイルをこちらから落としまして、Visual Studioで新規作成したプロジェクトにそれらを読み込む設定をし、該当処理を書き、dllexportを書き、"ffmpegwrapper.dll"としてビルドしました。
そののちC#側から
Csharp
1 2 private void ExecuteInternal() 3 { 4 try 5 { 6 Console.WriteLine( decode_video()); 7 }catch (Exception e) 8 { 9 MessageBox.Show(e.Message); 10 } 11 } 12 [DllImport("ffmpegwrapper.dll")] 13 static extern int decode_video();
のようにして呼び出したところ、DllNotFoundExceptionが投げられて
DLL `ffmpegwrapper.dll`が読み込めません:指定されたプロシージャが見つかりません。(HRESULT からの例外:0x8007007F)
と返されて実行されませんでした。ffmpegwrapper.dllは実行ファイルの場所に配置しております。
試しにC++ DLL(ffmpegwrapper.dll)側で、FFmpeg APIを呼び出す部分をすべて削除し、intを返すだけの関数をエクスポートしてC#から呼び出したところ、問題なく呼び出されました。しかしそのままもう一度FFmpeg APIを呼び出す関数を記述すると、たとえC#側でその関数を呼び出さずとも、DLL読み込みでエラーが発生することが分かりました。
ffmpegwrapper.dllがFFmpeg APIのDLLを参照/リンクする際に何らかの不具合が発生していると考え、DLLの依存情報を閲覧することができるDependency Walkerでffmpegwrapper.dllを見てみたところ、以下の様に表示されました。
avcodec-58.dll, avutil-56.dllがFFmpeg APIのDLLです。左ペインにはffmpegwraper.dllが参照するDLLの一覧があり、右ペインには一覧から選択したDLL内でffmpegwrapper.dllが依存している関数の一覧が表示されています。そのうち緑色に表示されているのが、該当関数がDLL内に存在しているもので、赤色のものは該当関数がDLL内に見つからないことを示しています。
きちんとビルドされたDLLであればすべて緑色に表示されるはずです。
しかしなぜかavcodec-58.dllの関数の参照がavutil-56.dll側への参照としても登録されてしまっており、またavutil-56.dllの関数の参照がavcodec-58.dll側への参照としても登録されてしまっており、その結果双方で赤色の表示が出てしまっているようです。
FFmpeg APIの.dll, .lib, .hをC++プロジェクトに登録する際の設定が間違っているのでしょうか?仮に間違えていたとして、正常にビルドが通っているのにこのようなDLLが生成されてしまうことがあるのでしょうか?
C++の経験があまりないので根本的な勘違いをしてるのかもしれませんが、お分かりの方がいらっしゃったら対処法を教えてください。
補足情報(FW/ツールのバージョンなど)
Visual Studio 2015
.NET Framework 4.5.2
FFmpeg Builds for Windows by Zeranoe 20180211-8b154cb-win64
Visual Studio(C++ DLL)のプロジェクトの作成設定は以下の通りです。
・Win32 コンソールアプリケーション、DLL、シンボルをエクスポート
FFmpeg APIの.dll, .lib, .hを読み込むためにした設定は以下の通りです。
プロジェクトの「プロパティ ページ」にて
・[C/C++] > [全般] > [追加のインクルード ディレクトリ] に.hファイルが格納されたディレクトリを指定
・[リンカー] > [全般] > [追加のライブラリ ディレクトリ] に.libと.dllが格納されたディレクトリを指定
・[リンカー] > [入力] > [追加の依存ファイル] にすべての.libのファイル名を指定

回答2件
あなたの回答
tips
プレビュー