簡體   English   中英

如何在Delphi中讀取第一個和最后一個64kb的視頻文件?

[英]How to read first and last 64kb of a video file in Delphi?

我想使用字幕API。 它需要md5哈希的第一個和最后64kb的視頻文件。 我知道如何做md5部分只是想知道如何獲得128kb的數據。

以下是Java中我無法在Delphi中實現的問題的解決方案。 如何用Java讀取第一個和最后一個64kb的視頻文件?

到目前為止我的Delphi代碼:

function TSubdbApi.GetHashFromFile(const AFilename: string): string;
var
  Md5: TIdHashMessageDigest5;
  Filestream: TFileStream;
  Buffer: TByteArray;
begin
  Md5 := TIdHashMessageDigest5.Create;
  Filestream := TFileStream.Create(AFilename, fmOpenRead, fmShareDenyWrite);
  try
    if Filestream.Size > 0 then begin
      Filestream.Read(Buffer, 1024 * 64);
      Filestream.Seek(64, soFromEnd);
      Filestream.Read(Buffer, 1024 * 64);
      Result := Md5.HashStreamAsHex(Filestream);
    end;
  finally
    Md5.Free;
    Filestream.Free;
  end;
end;

我沒有得到官方API所述的准確的md5哈希值。 API網址在這里 我正在使用Delphi XE8。

該API使用的hash function描述為:

我們的哈希是通過獲取視頻文件的第一個和最后一個64kb,將所有數據放在一起並生成md5的結果數據(128kb)。

我可以在你的代碼中看到一些問題。 您正在散列文件流,而不是您的Buffer數組。 除非您通過后續讀取文件流覆蓋該數組。 並且您試圖僅搜索64個字節,並且超出流的末尾(您需要使用負值來從流的末尾搜索)。 嘗試這樣的事情:

type
  ESubDBException = class(Exception);

function TSubdbApi.GetHashFromFile(const AFileName: string): string;
const
  KiloByte = 1024;
  DataSize = 64 * KiloByte;
var
  Digest: TIdHashMessageDigest5;
  FileStream: TFileStream;
  HashStream: TMemoryStream;
begin
  FileStream := TFileStream.Create(AFileName, fmOpenRead, fmShareDenyWrite);
  try
    if FileStream.Size < DataSize then
      raise ESubDBException.Create('File is smaller than the minimum required for ' +
        'calculating API hash.');

    HashStream := TMemoryStream.Create;
    try
      HashStream.CopyFrom(FileStream, DataSize);
      FileStream.Seek(-DataSize, soEnd);
      HashStream.CopyFrom(FileStream, DataSize);

      Digest := TIdHashMessageDigest5.Create;
      try
        HashStream.Position := 0;
        Result := Digest.HashStreamAsHex(HashStream);
      finally
        Digest.Free;
      end;
    finally
      HashStream.Free;
    end;
  finally
    FileStream.Free;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM