Изменить кодировку StandardInput.WriteLine

Я пытаюсь запустить исполняемый файл ffmpeg, используя Process для преобразования входного аудиофайла в формат mp3. Ниже приведен пример вызова, который очень хорошо работает, когда я делаю это из cmd.exe в Windows:

"ffmpeg.dll -i "inputPath\input.wav" -vn -ar 44100 -ac 2 -ab 320k -f mp3 -y "outputPath\output.mp3"

Пути к входным или выходным файлам могут содержать турецкие символы, такие как ş ö ç ğ. Поэтому я должен позаботиться о кодировках StreamWriter.

Мой фрагмент для StreamWriter:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.CreateNoWindow = false;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

Encoding tr_encoding = Encoding.GetEncoding("iso-8859-9");

using (StreamWriter sw = new StreamWriter(cmd.StandardInput.BaseStream, tr_encoding))
{
    sw.WriteLine(ffmpeg_cmd + " & exit");
}

cmd.WaitForExit(); 

Но я всегда получаю ошибку No such file or directory из ffmpeg, потому что путь к файлу содержит папку с именем şşşş, но мой StreamWriter отправляет имя этой папки как ■■■.

Как отправить аргументы командной строки в разных аргументах?


person abdullah cinar    schedule 24.04.2018    source источник
comment
попробуйте использовать строки utf8 - также попробуйте что-то вроде stackoverflow.com/questions/38533903/   -  person BugFinder    schedule 24.04.2018
comment
А зачем вообще запускать cmd.exe, и писать на его вход? Просто запустите ffmpeg напрямую.   -  person Evk    schedule 24.04.2018
comment
@BugFinder На самом деле я тоже не смог запустить его с преобразованием строк в этих темах. Что касается вашего второго ответа, я преобразовывал их с помощью cmd.exe в Windows, поэтому я просто хотел сделать это так, как в примерах, поскольку я новичок в C#. Как вы думаете, это может быть связано с этим?   -  person abdullah cinar    schedule 24.04.2018


Ответы (1)


Я наконец решил проблему.

iso-8859-9 не был точным типом кодирования для символа ş. Для этого мне нужно было использовать кодировку ibm857.

Ниже приведен фиксированный фрагмент кода:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

Encoding tr_encoding = Encoding.GetEncoding(857);

StreamWriter streamWriter = new StreamWriter(cmd.StandardInput.BaseStream, tr_encoding);

streamWriter.WriteLine(ffmpeg_cmd + " & exit");
streamWriter.Close();

После этого я смог использовать турецкие символы в путях к файлам.

person abdullah cinar    schedule 24.04.2018