Полезные пункты контекстного меню для mp4 | ffmpeg
Цитата: Alt от 02.09.2022, 00:24Спасибо за обьяснение, буду изучать)
Спасибо за обьяснение, буду изучать)
Цитата: Сергей от 02.09.2022, 02:30Доброй ночи🌙
Сделал маленькое приложение из reg файла в шапке, позволяющее автоматизировать процесс добавления/удаления из контекстного меню.
Не судите строго, сам ещё учусь по урокам Хачатура, если что-то не так, говорите, попробую исправить.Что Вам нужно: просто положите в любую папку ffmpeg.exe, icon.ico, и данное приложение вместе, после запуска приложение само найдёт эти файлы и Вам останется просто нажать на кнопку 'Добавить в контекстное меню'.
Скриншот, ссылка на приложение, исходник[spoiler title="P.S."]Если моё приложение кому-то будет полезно и если Хачатур посчитает нужным добавить его в основной пост темы, буду очень рад что сэкономил кому-то несколько минут на изменение reg файла 😅[/spoiler]
Доброй ночи🌙
Сделал маленькое приложение из reg файла в шапке, позволяющее автоматизировать процесс добавления/удаления из контекстного меню.
Не судите строго, сам ещё учусь по урокам Хачатура, если что-то не так, говорите, попробую исправить.
Что Вам нужно: просто положите в любую папку ffmpeg.exe, icon.ico, и данное приложение вместе, после запуска приложение само найдёт эти файлы и Вам останется просто нажать на кнопку 'Добавить в контекстное меню'.
Скриншот, ссылка на приложение, исходник
Цитата: Mikhail от 02.09.2022, 04:25Привет.
Для кого-то очень полезно, некоторые до сих пор не знают, что в reg файл нужно писать двойной слеш, даже если видят пример, все равно не дописывают), так что очень полезная штука👍.
Привет.
Для кого-то очень полезно, некоторые до сих пор не знают, что в reg файл нужно писать двойной слеш, даже если видят пример, все равно не дописывают), так что очень полезная штука👍.
Цитата: ЯR от 02.09.2022, 07:33Доброе утро, Сергей.
Утилита удобная, но большой минус в том, что при нажатии на кнопку [button]Удалить из контекстного меню[/button] полностью очищается содержимое раздела. У меня там был модифицированный сабж (вложенное меню + нажатие [button]Shift[/button]) и пункт от MediaInfo. Короче, утилита всё удалила.
Было бы правильнее удалять конкретно добавленные ключи, а не родительский Shell.
Доброе утро, Сергей.
Утилита удобная, но большой минус в том, что при нажатии на кнопку Удалить из контекстного меню полностью очищается содержимое раздела. У меня там был модифицированный сабж (вложенное меню + нажатие Shift) и пункт от MediaInfo. Короче, утилита всё удалила.
Было бы правильнее удалять конкретно добавленные ключи, а не родительский Shell.
Цитата: Андрей от 02.09.2022, 07:45Доброе. Ещё хорошо бы,чтоб после нажатия на пункт меню,окно программы закрывалось.
Доброе. Ещё хорошо бы,чтоб после нажатия на пункт меню,окно программы закрывалось.
Цитата: XpucT от 02.09.2022, 10:03Андрей, доброе утро🖐
Оно закрывается по завершении операции.
Андрей, доброе утро🖐
Оно закрывается по завершении операции.
Цитата: Сергей от 02.09.2022, 10:47Цитата: Яр от 02.09.2022, 07:33Доброе утро, Сергей.
Утилита удобная, но большой минус в том, что при нажатии на кнопку [button]Удалить из контекстного меню[/button] полностью очищается содержимое раздела. У меня там был модифицированный сабж (вложенное меню + нажатие [button]Shift[/button]) и пункт от MediaInfo. Короче, утилита всё удалила.
Было бы правильнее удалять конкретно добавленные ключи, а не родительский Shell.Добрый день, Яр👋
Извините, не подумал. Сделал проверку - если в реестре в .mp4\shell есть что-то кроме пунктов ffmpeg, то трогать не будет, если нету - то удаляет.
Проверьте, пожалуйста. Спасибо за отзыв.Также добавил возможность отдельно включить пункты если кому-то не нужны все.
Скриншот, ссылка на приложение, исходник
Цитата: Яр от 02.09.2022, 07:33Доброе утро, Сергей.
Утилита удобная, но большой минус в том, что при нажатии на кнопку Удалить из контекстного меню полностью очищается содержимое раздела. У меня там был модифицированный сабж (вложенное меню + нажатие Shift) и пункт от MediaInfo. Короче, утилита всё удалила.
Было бы правильнее удалять конкретно добавленные ключи, а не родительский Shell.
Добрый день, Яр👋
Извините, не подумал. Сделал проверку - если в реестре в .mp4\shell есть что-то кроме пунктов ffmpeg, то трогать не будет, если нету - то удаляет.
Проверьте, пожалуйста. Спасибо за отзыв.
Также добавил возможность отдельно включить пункты если кому-то не нужны все.
Скриншот, ссылка на приложение, исходник
Цитата: shim от 02.09.2022, 10:49Цитата: XpucT от 01.09.2022, 12:24
Всем привет 🖐
Делюсь своим шеллом контекстного меню для mp4, который сохраняет массу времениДобрый день!
можно добавить пункт "отключение звука в видео" или "пересохранить без аудио" ?
Цитата: XpucT от 01.09.2022, 12:24
Всем привет 🖐
Делюсь своим шеллом контекстного меню для mp4, который сохраняет массу времени
Добрый день!
можно добавить пункт "отключение звука в видео" или "пересохранить без аудио" ?
Цитата: ЯR от 02.09.2022, 11:31Цитата: shim от 02.09.2022, 10:49Добрый день!
можно добавить пункт "отключение звука в видео" или "пересохранить без аудио" ?Добрый день, shim.
В разделеcommand, в отличие от Пересохранить видео, нужно добавить такую строку:-vcodec copy -an
Для сравнения (до и после):"ПУТЬкFFMPEG\ffmpeg.exe" -i "%1" -crf 22 "%1.mp4" "ПУТЬкFFMPEG\ffmpeg.exe" -i "%1" -crf 22 -vcodec copy -an "%1.mp4"или в cmd 2 команды:
reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио" /v "icon" /t REG_SZ /d "\"ПУТЬкFFMPEG\icon.ico\"" /f reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио\command" /ve /t REG_SZ /d "\"ПУТЬкFFMPEG\ffmpeg.exe\" -i \"%1\" -crf 22 -vcodec copy -an \"%1.mp4\"" /fНе забываем добавить свой путь к ffmpeg
Цитата: shim от 02.09.2022, 10:49Добрый день!
можно добавить пункт "отключение звука в видео" или "пересохранить без аудио" ?
Добрый день, shim.
В разделе Скопированоcommand , в отличие от Пересохранить видео, нужно добавить такую строку: Скопировано-vcodec copy -an
Для сравнения (до и после):
"ПУТЬкFFMPEG\ffmpeg.exe" -i "%1" -crf 22 "%1.mp4" "ПУТЬкFFMPEG\ffmpeg.exe" -i "%1" -crf 22 -vcodec copy -an "%1.mp4"
или в cmd 2 команды:
reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио" /v "icon" /t REG_SZ /d "\"ПУТЬкFFMPEG\icon.ico\"" /f reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио\command" /ve /t REG_SZ /d "\"ПУТЬкFFMPEG\ffmpeg.exe\" -i \"%1\" -crf 22 -vcodec copy -an \"%1.mp4\"" /f
Не забываем добавить свой путь к ffmpeg
Цитата: XpucT от 02.09.2022, 11:49[spoiler title="Оффтоп:"]
Сергей, привет 🖐
По коду, если позволишь, пару рекомендаций на будущее:Так как поля в C# прогружаются сразу с инициализацией, то такие задачи, как поиск файла – не рекомендую туда писать.
Пока утилита маленькая, ничего незаметно, однако, это сильно будет влиять на скорость запуска, когда в коде строк 1000 и более.
Поэтому поля нужно превращать в свойства, чтобы они были инициализированы только в момент обращения к ним.То есть, писать нужно не так:
readonly string pathexe = File.Exists("ffmpeg.exe") ? thisexepath.Replace(thisexename, "ffmpeg.exe") : "";а так:
string pathexe => File.Exists("ffmpeg.exe") ? thisexepath.Replace(thisexename, "ffmpeg.exe") : "";В Твоём случае, поля должны быть сразу инициализированы и отображены в labels, однако, Я говорю просто про подход.
Хуже не будет, если сразу делать правильно =)
Также в коде довольно часто открывается инстанс на Registry и постоянно используется строка
SOFTWARE\Classes\SystemFileAssociations\.mp4
Сократить код, уменьшить программу и снизить нагрузку можно простым using:using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4", true)) { if (checkBox1.Checked) { key.CreateSubKey(@"shell\Заменить звук").SetValue("icon", $"\"{pathicon}\""); key.CreateSubKey(@"shell\Заменить звук\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -i 1.mp3 -c:v copy -map 0:v:0 -map 1:a:0 \"%1.mp4\""); checkBox1.Checked = false; } if (checkBox2.Checked) { key.CreateSubKey(@"shell\Извлечь wav").SetValue("icon", $"\"{pathicon}\""); key.CreateSubKey(@"shell\Извлечь wav\command").SetValue("", $"\"{pathexe}\" -i \"%1\" \"%1.wav\""); checkBox2.Checked = false; } if (checkBox3.Checked) { key.CreateSubKey(@"shell\Пересохранить mp4").SetValue("icon", $"\"{pathicon}\""); if (!CheckBoxAlt.Checked) key.CreateSubKey(@"shell\Пересохранить mp4\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -crf 22 \"%1.mp4\""); else key.CreateSubKey(@"shell\Пересохранить mp4\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy \"%1.mp4\""); checkBox3.Checked = false; } }Если по синтаксису, то это:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell", false)) if (key != null) foreach (string name in key.GetSubKeyNames()) if (name != "Заменить звук" && name != "Извлечь wav" && name != "Пересохранить mp4") modified = true;Я бы заменил на это:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell")) modified = (bool)key?.GetSubKeyNames().All(x => x != "Заменить звук" && x != "Извлечь wav" && x != "Пересохранить mp4");Но подход такой неправильный, потому что в цикле проверяется каждый элемент по каждому имени, и каждый всегда попадёт хотя бы 1 раз и в true и в false. Это превращает цикл в ненужную кашу. Поэтому идеальная проверка будет выглядеть так:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell")) modified = new List<string> { "Заменить звук", "Извлечь wav", "Пересохранить mp4" }.All(x => (bool)key?.GetSubKeyNames().Any(y => y == x));[/spoiler]
Сергей, привет 🖐
По коду, если позволишь, пару рекомендаций на будущее:
Так как поля в C# прогружаются сразу с инициализацией, то такие задачи, как поиск файла – не рекомендую туда писать.
Пока утилита маленькая, ничего незаметно, однако, это сильно будет влиять на скорость запуска, когда в коде строк 1000 и более.
Поэтому поля нужно превращать в свойства, чтобы они были инициализированы только в момент обращения к ним.
То есть, писать нужно не так:
readonly string pathexe = File.Exists("ffmpeg.exe") ? thisexepath.Replace(thisexename, "ffmpeg.exe") : "";
а так:
string pathexe => File.Exists("ffmpeg.exe") ? thisexepath.Replace(thisexename, "ffmpeg.exe") : "";
В Твоём случае, поля должны быть сразу инициализированы и отображены в labels, однако, Я говорю просто про подход.
Хуже не будет, если сразу делать правильно =)
Также в коде довольно часто открывается инстанс на Registry и постоянно используется строка СкопированоSOFTWARE\Classes\SystemFileAssociations\.mp4
Сократить код, уменьшить программу и снизить нагрузку можно простым using:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4", true))
{
if (checkBox1.Checked)
{
key.CreateSubKey(@"shell\Заменить звук").SetValue("icon", $"\"{pathicon}\"");
key.CreateSubKey(@"shell\Заменить звук\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -i 1.mp3 -c:v copy -map 0:v:0 -map 1:a:0 \"%1.mp4\"");
checkBox1.Checked = false;
}
if (checkBox2.Checked)
{
key.CreateSubKey(@"shell\Извлечь wav").SetValue("icon", $"\"{pathicon}\"");
key.CreateSubKey(@"shell\Извлечь wav\command").SetValue("", $"\"{pathexe}\" -i \"%1\" \"%1.wav\"");
checkBox2.Checked = false;
}
if (checkBox3.Checked)
{
key.CreateSubKey(@"shell\Пересохранить mp4").SetValue("icon", $"\"{pathicon}\"");
if (!CheckBoxAlt.Checked)
key.CreateSubKey(@"shell\Пересохранить mp4\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -crf 22 \"%1.mp4\"");
else
key.CreateSubKey(@"shell\Пересохранить mp4\command").SetValue("", $"\"{pathexe}\" -i \"%1\" -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy \"%1.mp4\"");
checkBox3.Checked = false;
}
}
Если по синтаксису, то это:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell", false))
if (key != null)
foreach (string name in key.GetSubKeyNames())
if (name != "Заменить звук" && name != "Извлечь wav" && name != "Пересохранить mp4")
modified = true;
Я бы заменил на это:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell"))
modified = (bool)key?.GetSubKeyNames().All(x => x != "Заменить звук" && x != "Извлечь wav" && x != "Пересохранить mp4");
Но подход такой неправильный, потому что в цикле проверяется каждый элемент по каждому имени, и каждый всегда попадёт хотя бы 1 раз и в true и в false. Это превращает цикл в ненужную кашу. Поэтому идеальная проверка будет выглядеть так:
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Classes\SystemFileAssociations\.mp4\shell"))
modified = new List<string> { "Заменить звук", "Извлечь wav", "Пересохранить mp4" }.All(x => (bool)key?.GetSubKeyNames().Any(y => y == x));
Цитата: ЯR от 02.09.2022, 12:38В разделе
command, в отличие от Пересохранить видео, нужно добавить такую строку:-vcodec copy -anМоя ошибка: ключ
-vcodec copyне сжимает видеоряд, и ключ-crf 22игнорируется.Достаточно добавить ключ
-anreg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио" /v "icon" /t REG_SZ /d "\"ПУТЬкFFMPEG\icon.ico\"" /f reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио\command" /ve /t REG_SZ /d "\"ПУТЬкFFMPEG\ffmpeg.exe\" -i \"%1\" -crf 22 -an \"%1.mp4\"" /fИсправьте у себя, кто уже применил.
В разделе
command, в отличие от Пересохранить видео, нужно добавить такую строку:-vcodec copy -an
Моя ошибка: ключ Скопировано-vcodec copy не сжимает видеоряд, и ключ Скопировано-crf 22 игнорируется.
Достаточно добавить ключ Скопировано-an
reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио" /v "icon" /t REG_SZ /d "\"ПУТЬкFFMPEG\icon.ico\"" /f reg add "HKCU\SOFTWARE\Classes\SystemFileAssociations\.mp4\Shell\FFMPEG\shell\Пересохранить без аудио\command" /ve /t REG_SZ /d "\"ПУТЬкFFMPEG\ffmpeg.exe\" -i \"%1\" -crf 22 -an \"%1.mp4\"" /f
Исправьте у себя, кто уже применил.
Цитата: kokos от 02.09.2022, 12:54Добрый день. есть просьба. было бы здорово сделать такой же шелл для качественного пережатия из мп4 в гиф. если конечно это возможно. заранее спасибо
Добрый день. есть просьба. было бы здорово сделать такой же шелл для качественного пережатия из мп4 в гиф. если конечно это возможно. заранее спасибо
Всем привет 🖐