5

C# でHandbrakeを動作させることができません。「値をnullにすることはできません」というエラーがスローされ続けます。. 以下のスクリーンショットでわかるように、私が知っていることに基づいていくつかのことを試しました。この作業を行うのに役立つガイダンスをいただければ幸いです。

ハンドブレーキエンコーダエラー

私がこれまでに試したこと(ポイントは表示されたエラーとは関係ありません..参考までに):

  1. PCにハンドブレーキを取り付けました
  2. HandBrakeInterop.dll への参照を追加しました
  3. 他のすべての必要なdllをデバッグフォルダーにコピーし、それらを参照として追加しようとしました
  4. x86/x64 からデバッグ バージョンを変更してみました

どこが正しい軌道に乗っていないのでしょうか?

これが私のコードです:

      HandBrake.Interop.HandBrakeInstance objHb = new HandBrake.Interop.HandBrakeInstance();
    HandBrake.Interop.Model.EncodeJob objJob = new HandBrake.Interop.Model.EncodeJob();
    objJob.SourceType = HandBrake.Interop.Model.SourceType.File;
    EncodingProfile objProfile = new EncodingProfile();
    objProfile.OutputFormat = Container.Mp4;
    objProfile.VideoEncodeRateType = VideoEncodeRateType.ConstantQuality;
    objProfile.IPod5GSupport = true;
    objProfile.PreferredExtension = OutputExtension.Mp4;
   // objJob.EncodingProfile = objProfile;
    objJob.SourcePath = AppDomain.CurrentDomain.BaseDirectory + "1.flv";
    objJob.OutputPath = AppDomain.CurrentDomain.BaseDirectory + "1.mp4";
    //objHb.Titles.Add(new HandBrake.Interop.SourceData.Title());

    XmlSerializer objSerializer = new XmlSerializer(typeof(EncodingProfile));


   MemoryStream mem=new MemoryStream(File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "normal.xml"));
 var objPresetFromFile =  objSerializer.Deserialize(mem) as EncodingProfile;
 objJob.EncodingProfile = objPresetFromFile;
    objJob.UseDefaultChapterNames = true;
   // objJob.Title = 1;



    //HandBrake.Interop.Model.Encoders
    objHb.EncodeProgress += objHb_EncodeProgress;
    objHb.EncodeCompleted += objHb_EncodeCompleted;
    HandBrake.ApplicationServices.Parsing.Title title = new HandBrake.ApplicationServices.Parsing.Title();// new HandBrake.Interop.SourceData.Title();
    objHb.Initialize(5);
    //objHb.Titles = new System.Collections.Generic.List<HandBrake.Interop.SourceData.Title>();
    objHb.StartScan(AppDomain.CurrentDomain.BaseDirectory + "1.flv", 0);
    objJob.SourceType = HandBrake.Interop.Model.SourceType.File;
    objJob.RangeType = HandBrake.Interop.Model.VideoRangeType.Frames;

    objHb.StartEncode(objJob);

    Console.ReadLine();

編集: 要求に応じて、クリップボードにコピーされた例外からの詳細情報を次に示します

System.ArgumentNullException was unhandled
  HResult=-2147467261
  Message=Value cannot be null.
Parameter name: source
  Source=System.Core
  ParamName=source
  StackTrace:
       at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
       at HandBrake.Interop.HandBrakeInstance.GetTitle(Int32 titleNumber) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 1604
       at HandBrake.Interop.HandBrakeInstance.GetTitleIndex(Int32 titleNumber) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 1614
       at HandBrake.Interop.HandBrakeInstance.StartEncode(EncodeJob job, Boolean preview, Int32 previewNumber, Int32 previewSeconds, Double overallSelectedLengthSeconds) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 411
       at HandBrake.Interop.HandBrakeInstance.StartEncode(EncodeJob jobToStart) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 395
       at HandBrakeTest.Program.Main(String[] args) in c:\Users\user\Documents\Visual Studio 2012\Projects\HandBrakeTest\HandBrakeTest\Program.cs:line 53
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

編集 :

  1. handbrakeinstance と encodingjob のインスタンスをメインの外に移動し、静的にしました
  2. スキャン完了イベントで StartEncode を呼び出す

現在、例外は Nullreferenceexception で、詳細に次のように記載されています。

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=HandBrakeInterop
  StackTrace:
       at HandBrake.Interop.InteropUtilities.ReadStructure[T](IntPtr structPtr) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\InteropUtilities.cs:line 31
       at HandBrake.Interop.HandBrakeInstance.StartEncode(EncodeJob job, Boolean preview, Int32 previewNumber, Int32 previewSeconds, Double overallSelectedLengthSeconds) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 412
       at HandBrake.Interop.HandBrakeInstance.StartEncode(EncodeJob jobToStart) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 395
       at HandBrakeTest.Program.objHb_ScanCompleted(Object sender, EventArgs e) in c:\Users\user\Documents\Visual Studio 2012\Projects\HandBrakeTest\HandBrakeTest\Program.cs:line 65
       at HandBrake.Interop.HandBrakeInstance.PollScanProgress() in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 811
       at HandBrake.Interop.HandBrakeInstance.<StartScan>b__2(Object o, ElapsedEventArgs e) in c:\HandBrake\Hudson\workspace\Release_WindowsGui64\0.9.9\win\CS\HandBrake.Interop\HandBrakeInterop\HandBrakeInstance.cs:line 752
       at System.Timers.Timer.MyTimerCallback(Object state)
  InnerException: 

前もって感謝します。

4

2 に答える 2

7

ええ、HandBrakeInterop はコードを書くだけの簡単な API ではありません。現時点では、完全なエンコーダー GUI を対象としています。デフォルトにうまくフォールバックしません。XML から EncodingProfile を取得するだけで、本当に良いアイデアが浮かびました。

以下は、HandBrakeInterop とやり取りする作業中の最小限のプロジェクトです: http://engy.us/misc/HandBrakeInteropExample.zip

関連するビット:

instance = new HandBrakeInstance();
instance.Initialize(verbosity: 1);
instance.ScanCompleted += instance_ScanCompleted;
instance.StartScan(SourceFile, previewCount: 10);
  • 1 はデフォルトの冗長性です。あなたが渡した「5」は無効です。
  • おそらく、StartScan の previewCount に実際の値を渡したいと思うでしょう。これらの静的プレビューを使用して、自動クロッピング検出やコーミング検出などを行います。
var ジョブ = 新しい EncodeJob
    {
        EncodingProfile = プロファイル、
        RangeType = VideoRangeType.All、
        タイトル = 1、
        SourcePath = ソースファイル、
        OutputPath = AppDomain.CurrentDomain.BaseDirectory + "Output.mp4",
        ChosenAudioTracks = 新しいリスト { 1 },
        字幕 = 新しい字幕
            {
                SourceSubtitles = 新しいリスト(),
                SrtSubtitles = 新しいリスト()
            }
    };
  • エンコードするタイトルを渡す必要があります (1 ベースのインデックス)。ファイルの場合、これはほとんど関係ありません。この機能は、DVD/Blu-ray スキャン用に設計されています。
  • a と範囲の詳細の両方を渡す必要があります。RangeTypeたとえば、RangeTypeofを選択した場合は、 andFramesを指定する必要があります。余分なものを指定する必要がないため、最も簡単です。FramesStartFramesEndRangeType.All
  • 選択したオーディオ トラック インデックス (1 ベース) のリストを指定する必要があります。通常、ファイルには役立ちませんが、複数の言語を持つ DVD/Blu-ray ディスクには役立ちます。
  • 現時点では、字幕の下に何かを指定する必要があります。そうしないと、クラッシュします。これは実際にはバグです。私が正しく守っていなかったいくつかのケースがありました。将来的にこれを修正します。

API の完全なリファレンス実装を確認したい場合は、VidCoderをチェックしてください。HandBrake は一部使用を開始しましたが、静的プレビューや一時停止/再開などのすべての機能に対応しているわけではありません。

更新: 必要なコードは完全に異なって見え、HandBrake.ApplicationServices.dll をターゲットにしています。新しい最小限のプロジェクト: http://engy.us/misc/HBInteropExampleV3.zip

顕著な違いは、エンコード ジョブが JSON で指定されるようになったことです。これは、HandBrake/VidCoder のエンコード ログに吐き出されるものとまったく同じ JSON blob であるため、そこから盗んで調整することができます。

于 2013-05-27T17:48:15.763 に答える
1

ここでソースコードをざっと見てみました。は実際には非同期呼び出しのようであり、呼び出す前にイベントが発生するStartScanのを待つ必要があります。ScanCompletedStartEncode

起こっているように見えるのは、Titlesコレクションが null であることです。PollScanProgressこれは、スキャンの進行状況をチェックするタイマーで起動するように見えるプライベート メソッドに取り込まれます。タイマーは で設定されStartScanます。

于 2013-05-27T06:08:49.160 に答える