Как обновить видеокодеки, показанные в списке, представленном AviSaveOptions(), чтобы показать недавно установленный кодек?
У меня есть приложение Delphi 6 с мастером, который помогает людям выбрать подходящий видеокодек. Он использует AviSaveOptions(), чтобы показать пользователю список видеокодеков, чтобы они могли выбрать один. Выбор сохраняется на диск для последующего повторного использования. В какой-то момент в мастере пользователю предлагается загрузить и установить один из нескольких популярных видеокодеков с помощью своего браузера, если у него нет подходящего. Однако после установки нового видеокодека и возвращения в мое приложение, когда я вызываю AviSaveOptions() во второй раз, чтобы они могли выбрать только что установленный видеокодек, в списке не отображается новый кодек.
Если я полностью выйду из приложения и вернусь к мастеру, вызов AviSaveOptions() покажет новый кодек в диалоговом окне. Я, очевидно, хотел бы обновить список из моего приложения, чтобы пользователю не приходилось перезагружать программу, чтобы выбрать новый кодек. Я вызываю AviFileInit() и AviFileExit() в моем методе, который вызывает AviSaveOptions(). Что еще мне нужно сделать, чтобы список кодеков, показанный в диалоговом окне AviSaveOptions(), был обновлен, чтобы показать недавно установленный видеокодек? Ниже приведен код, который я использую для вызова AviSaveOptions():
function doGetUsersCompressorChoice(theCallingForm: TForm; theFccType: FOURCC): FOURCC;
var
// theCompressionOptionsFile: TAviCompressionOptionsFile;
theCompressionOptions: TAVICOMPRESSOPTIONS;
res: LongBool;
hr: HRESULT;
intfAviStream: IAVIStream;
testVideoFilenameSrc, testVideoFilename: string;
aryCompressOpts: array[0..0] of PAVICOMPRESSOPTIONS;
fullSaveOptsFilePath: string;
begin
// fullPathToCompressorOptsFile := '';
if not Assigned(theCallingForm) then
raise Exception.Create('(doGetUsersCompressorChoice) The calling form is unassigned.');
// Make sure the test video file exists.
testVideoFilenameSrc := getTestVideoPath_compsettings + TEST_COMPRESSION_VIDEO_FILENAME;
if not FileExists(testVideoFilenameSrc) then
raise Exception.Create('(doGetUsersCompressorChoice) Unable to find the test video file: ' + testVideoFilename);
// Copy it since we are about to tinker with it and don't want to damage
// the original.
testVideoFilename := ChangeFileExt(testVideoFilenameSrc, '.comptest.avi');
if FileExists(testVideoFilename) then
begin
// Delete it.
if not DeleteFile(testVideoFilename) then
raise Exception.Create('(doGetUsersCompressorChoice) Unable to delete the test video file: ' + testVideoFilename);
end; // if FileExists(testVideoFilename) then
// Copy the source to the test file.
if not CopyFile(PChar(testVideoFilenameSrc), PChar(testVideoFilename), true) then
raise Exception.Create('(doGetUsersCompressorChoice) Unable to copy the source video file to the test video file (source, dest): ' + testVideoFilenameSrc + ', ' + testVideoFilename);
AVIFileInit;
FillChar(theCompressionOptions, SizeOf(theCompressionOptions), 0);
aryCompressOpts[0] := @theCompressionOptions;
// theCompressionOptionsFile := TAviCompressionOptionsFile.Create;
try
// Open the test video file.
hr := AVIStreamOpenFromFile(intfAviStream, PChar(testVideoFilename), theFccType, 0, OF_READ, nil);
checkAviResult('doGetUsersCompressorChoice', hr, 'Unable to open the test video file (AVIStreamOpenFromFile)');
// Now prompt the user for the desired compressor.
res := AVISaveOptions(theCallingForm.Handle, 0, 1, intfAviStream, aryCompressOpts[0]);
if res then
begin
{
IMPORTANT: Microsoft does not use the fccType field for
audio compressors and leaves it 0 when calling AviSaveOptions().
To compensate we are using a fake FOURCC equal to
('f','a','k','e') for audio compressors.
Therefore, you can't tell which audio compressor is in
use. The fake FOURCC is only to keep the compressor
options file object and methods happy since they
need an identifier to use when storing the compressor
settings.
We have a message about this on Stack Overflow but
so far no one has provided an answer on how to ID
the compressor being returned by
}
if theFccType = streamtypeAUDIO then
Result := stringToFOURCC(FOURCC_FAKE_AUDIO_COMPRESSOR_ID)
else
// Result is the FOURCC of the selected compressor.
Result := aryCompressOpts[0]^.fccHandler;
try
fullSaveOptsFilePath := getCompressorOptsFullFilePath(Result);
// Save the user's selected compressor settings to disk.
// theCompressionOptionsFile.save(aryCompressOpts[0]^);
if writeCompOptsFile(fullSaveOptsFilePath, aryCompressOpts[0]^) <> AVIERR_OK then
raise Exception.Create('(doGetUsersCompressorChoice) Unable to save the compressor options to disk, file name: ' + fullSaveOptsFilePath);
// Return the full path to the saved compressor options file.
// fullPathToCompressorOptsFile :=
// theCompressionOptionsFile.fullFilename;
finally
// Free the compression options variable.
AVISaveOptionsFree(1, aryCompressOpts[0]);
end; // try
end
else
begin
// User aborted operation. Just return the Result of 0.
Result := 0;
end;
finally
// if Assigned(theCompressionOptionsFile) then
// theCompressionOptionsFile.Free;
AviFileExit;
end; // try
end;