Сбой ffmpeg при обновлении файла наложения (консольное приложение С#)C#

Место общения программистов C#
Ответить
Anonymous
 Сбой ffmpeg при обновлении файла наложения (консольное приложение С#)

Сообщение Anonymous »

Я пытаюсь разработать консольное приложение, которое может записывать экран и отмечать использование процессора/памяти/графического процессора компьютера при записи. Проблема, с которой я столкнулся, заключается в том, что через некоторое время (2-3 часа) запись останавливается, потому что ffmpeg пытается прочитать текст файла, в то время как мой код C# пытается обновить файл. Мне удалось выяснить, что мне следует использовать временный файл и заменить оригинал вместо того, чтобы перезаписывать весь файл, но в этом случае я сталкиваюсь с другой проблемой: ffmpeg попытается прочитать файл, пока файл заменяется, или даже на ту долю секунды, когда он будет считается удаленным. Есть идеи, что мне делать? Как следует управлять методом с временным файлом или как сделать стабильным метод, обновляющий тот же файл? Я даже подумывал увеличить количество кадров перезагрузки ffmpeg, так как это может снизить вероятность сбоя, но это не 100%-ное решение, обеспечивающее защиту от сбоев.
Сообщение об ошибке, полученное от ffmpeg, с обновлением только текста из файл:

Код: Выделить всё

Error: [Parsed_drawtext_0 @ 000001e68fd95dc0] [FILE @ 0000009fb7ffee70] Error occurred in CreateFileMapping()
Error: [Parsed_drawtext_0 @ 000001e68fd95dc0] The text file 'OverlayFiles/OverlayFile_MyPC.txt' could not be read or is empty
Error: [vf#0:0 @ 000001e68fd48300] Error while filtering: Operation not permitted
Error: [vf#0:0 @ 000001e68fd48300] Task finished with error code: -1 (Operation not permitted)
Сообщение об ошибке, полученное от ffmpeg при использовании временного файла, заменяющего исходный файл:

Код: Выделить всё

Error: [Parsed_drawtext_0 @ 0000014c815e6200] [FILE @ 000000253d7fee70] Cannot read file 'OverlayFiles/OverlayFile_MyPC.txt': Permission denied
Error: [Parsed_drawtext_0 @ 0000014c815e6200] The text file 'OverlayFiles/OverlayFile_MyPC.txt' could not be read or is empty
Error: [vf#0:0 @ 0000014c81597280] Error while filtering: Permission denied
Error: [vf#0:0 @ 0000014c81597280] Task finished with error code: -13 (Permission denied)
Error: [vf#0:0 @ 0000014c81597280] Terminating thread with return code -13 (Permission denied)
аргументы ffmpeg:

Код: Выделить всё

string arguments = $"-video_size 1920x1080 -framerate 30 -f gdigrab -i desktop -c:v libx264rgb -crf 0 -preset ultrafast -color_range 2 " +
$"-vf \"drawtext=fontfile=C\\\\:/Windows/fonts/consola.ttf:fontsize=30:fontcolor='white':textfile={overlayFilePath_}:boxcolor=0x00000080:box=1:x=10:y=H-210:reload=1\" \"" +
outputFile + "\"";
Код, обновляющий файл наложения (1-я версия):

Код: Выделить всё

public void UpdateOverlayText(string filePath)
{
string usage = GetSystemUsage(filePath);  // Get the system usage data

try
{
// Open the file with FileShare.ReadWrite to allow other processes to read it while writing
using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
using (var writer = new StreamWriter(fileStream))
{
writer.Write(usage);   // Write the system usage data to the file
}
}

// Ensure file permissions are set correctly after writing
SetFilePermissions(filePath);
}
catch (IOException ex)
{
Console.WriteLine($"Error updating overlay file: {ex.Message}");
}
}
(UPDATE)Код, который обновляет файл наложения с помощью MemoryStream:

Код: Выделить всё

public void UpdateOverlayText(string filePath)
{
string usage = GetSystemUsage(filePath);

try
{
using (var memoryStream = new MemoryStream())
{
using (var writer = new StreamWriter(memoryStream))
{
writer.Write(usage);
writer.Flush();

memoryStream.Position = 0;

File.WriteAllBytes(filePath, memoryStream.ToArray());
}
}

SetFilePermissions(filePath);
}
catch (IOException ex)
{
Console.WriteLine($"Error updating overlay file: {ex.Message}");
}
}
Код протестирован с использованием файла MemoryStream и Temp:

Код: Выделить всё

public void UpdateOverlayText(string filePath)
{
string usage = GetSystemUsage(filePath);
string tempFilePath = filePath + ".tmp";
try
{
// Write to a temporary file first
using (var memoryStream = new MemoryStream())
{
using (var writer = new StreamWriter(memoryStream))
{
writer.Write(usage);
writer.Flush();

memoryStream.Position = 0;
File.WriteAllBytes(tempFilePath, memoryStream.ToArray());
}
}
File.Replace(tempFilePath, filePath, null);
}
catch (IOException ex)
{
Console.WriteLine($"Error updating overlay file: {ex.Message}");
}
finally
{
if (File.Exists(tempFilePath))
{
File.Delete(tempFilePath);
}
}
}
Заранее благодарим за помощь и приносим извинения за опечатки или неправильные фразы.


Подробнее здесь: https://stackoverflow.com/questions/792 ... onsole-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»