Skip to content

Commit

Permalink
Update ffmpeg.md
Browse files Browse the repository at this point in the history
Изменил некоторые порядоки команд
-Добавил двойные скобки почти везде где указывается путь к файлу или сам файл чтобы избежать проблем с пробелами.
-В последней команде для telegram изменил немного порядок чтобы она не выделялась по сравнению с другими.
Плюс мелкие правки.
  • Loading branch information
konoos56 committed Jan 23, 2024
1 parent 86314a5 commit fb15dfe
Showing 1 changed file with 98 additions and 28 deletions.
126 changes: 98 additions & 28 deletions docs/apps/ffmpeg.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ ffmpeg -i audio_file.mp3 -hide_banner
Примеры:

```shell
ffmpeg -i video_input.mp4 video_output.avi
ffmpeg -i video_input.webm video_output.flv
ffmpeg -i audio_input.mp3 audio_output.ogg
ffmpeg -i audio_input.wav audio_output.flac
ffmpeg -i "video_input.mp4" "video_output.avi"
ffmpeg -i "video_input.webm" "video_output.flv"
ffmpeg -i "audio_input.mp3" "audio_output.ogg"
ffmpeg -i "audio_input.wav" "audio_output.flac"
```

Ознакомится со всем списком всех поддерживаемых форматов, используйте:
Expand All @@ -61,51 +61,103 @@ ffmpeg -i audio_input.wav audio_output.flac
ffmpeg -formats
```

## Измените разрешение видео или соотношение сторон

Еще одна простая задача для ffmpeg. Все, что вам нужно сделать, чтобы изменить размер видео, - это указать новое разрешение после флага `-s``:

```shell
ffmpeg -i "Файл.avi" -s 1024x576 "Файл.mp4"
```

## Обрезка видео без перекодирования
К примеру первые 45 минут вырезать из видео:

```shell
ffmpeg -i "Видео.mkv" -ss 00:45:00 -c copy "Видео2.mkv"
```
Обрезать видео с определенного времени до определенного времени:

```shell
ffmpeg -i "Видео.mkv" -ss 00:45:00 -to 1:55:00 -c copy "Видео2.mkv"
```


## Сохранение оригинальности качества контента при кодировании.

Укажите параметр `-qscale 0` перед выходным файлом, чтобы сохранить качество видеофайла:

```shell
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
ffmpeg -hide_banner -i "Файл.avi" -qscale 0 "Файл.mp4"
```
##В данном примере приведён аналог опции `-qscale 0` для сохранения оригинальность качества видео путём сохранения битрейта.

Как перекодировать все файлы в директории не зависимо от расширения видео-файлов с аппаратным ускорением NVENC и сохранением оригинального битрейта и копирование первой аудио-дорожки. Так же тут сохранено оригинальное название файлов.

::: tip
Опция -qscale 0 стремится к сохранению качества не только видео но так же и аудио дорожки.
:::


В данном примере приведён аналог опции `-qscale 0` в котором мы извлекаем битрейт с помощью которого пытаемся сохранить оригинальность качества контента.

```shell
for i in *; do
bitrate=$(ffmpeg -hide_banner -i "$i" 2>&1 | grep -oP 'bitrate: \K[0-9]+')
ffmpeg -hide_banner -i "$i" -map 0:v:0 -map 0:a:0 -c:v h264_nvenc -b:v ${bitrate}k -c:a copy "/путь/к/существующей/директории/где/сохранить/итоговые/файлы/${i%.*}.mkv";
done
bitrate=$(ffmpeg -hide_banner -i "Файл.avi" 2>&1 | grep -oP 'bitrate: \K[0-9]+');
ffmpeg -hide_banner -i "Файл.avi" -c:v libx264 -b:v ${bitrate}k -c:a copy "/путь/куда/сохранить/Файл.mkv"
```

## Измените разрешение видео или соотношение сторон
::: tip
Обратите внимание что нужно указать нужный файл для кодирования в первой и второй строчке.
:::

Еще одна простая задача для ffmpeg. Все, что вам нужно сделать, чтобы изменить размер видео, - это указать новое разрешение после флага `-s``:
Индентичная процедура но для всех файлов в каталоге.

```shell
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
for i in *.mp4; do ffmpeg -hide_banner -i "$i" -qscale 0 "/путь/к/каталогу/${i%.*}.mkv"; done
```

В данной команде мы используем кодек `x264` для кодирования

```shell
for i in *.mkv; do
bitrate=$(ffmpeg -hide_banner -i "$i" 2>&1 | grep -oP 'bitrate: \K[0-9]+')
ffmpeg -hide_banner -i "$i" -map 0:v:0 -map 0:a:0 -c:v libx264 -b:v ${bitrate}k -c:a copy "/путь/к/существующей/директории/где/сохранить/итоговые/файлы/${i%.*}.mkv";
done
```

::: info
Использовать аппаратное ускорение видеокарты.
Отредактируйте строчку `-c:v libx264`
NVIDIA NVENC `-c:v h264_nvenc`
AMD AMF `-c:v h264_amf`
Intel Quick Sync Video `-c:v h264_qsv`
:::

::: tip
Тут указываем что в данном каталоге мы берём для кодирования все файлы с нужным расширением.
`for i in *.mkv;`
`for i in *.avi;`
`for i in *.mp4;`
И так далее
Так же можно указать без расширения что по итогу затроен абсолютно все файлы в каталоге не зависимо от их расшрения
`for i in *;`
:::

## Изменение структуры контейнера видео-файла без изменения качества видео
Допустим у нас есть видео файл с 5 аудио дорожками и многочисленным количеством субтитров, а нам необходимо видео конкретно с первой аудио дорожкой и вторыми по порядку субтитрами.
`-map 0:v:0` тут выделяем первую видео дорожку. `-map 0:a:0` тут указываем что нужна только первая аудио-дорожка. `-map 0:s:1` тут указываем что нужны только вторые по порядку субтитры (Порядок начинается не с 1 а с 0, будьте внимательны)
`-map 0:v:0` тут выделяем первую видео дорожку. `-map 0:a:0` тут указываем что нужна только первая аудио-дорожка. `-map 0:s:1` тут указываем что нужны только вторые по порядку субтитры

::: tip
Порядок начинается не с 1 а с 0, будьте внимательны
:::

```shell
ffmpeg -hide_banner -i "файл.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a copy -c:s copy "/путь/к/файлу/куда/сохранить/файл.mkv"
```

##Обрезка видео без перекодирования в текущем каталоге.
К примеру первые 45 минут вырезать из видео:

```shell
ffmpeg -i "Видео.mkv" -ss 00:45:00 -c copy "Видео2.mkv"
```
Обрезать видео с определенного времени до определенного времени:
## Изменить формат звуквой дорожки не затрагивая видео кодек. Возьмём предыдущию команду в качестве примера.

```shell
ffmpeg -i "Видео.mkv" -ss 00:45:00 -to 1:55:00 -c copy "Видео2.mkv"
```
ffmpeg -hide_banner -i "файл.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a ac3 -c:s copy "/путь/к/файлу/куда/сохранить/файл.mkv"
```

##Обьеденяет видео без перекодирования с расширением .mkv (текущий каталог) аудио с расширением .mka и субтитры с расширением .ass с одинаковыми названиями. Так же сохраняется оригинальность названия и расширения видео-файлов.
## Обьеденяет видео без перекодирования с расширением .mkv (текущий каталог) аудио с расширением .mka и субтитры с расширением .ass с одинаковыми названиями. Так же сохраняется оригинальность названия и расширения видео-файлов.

Предположим что у вас есть сериал в котором находятся серии и два каталога с нужным аудио-переводом и субтитрами. (Все изначальные расширения в команде вы можете изменить под свои)

Expand All @@ -116,19 +168,37 @@ do
done
```

##Справка по обозначению опций `-map 0:v:0` `-map 0:a:0` `-map 0:s:0`
::: tip
Справка по сокращению опций `-c:v copy` `-c:a copy` `-c:s copy`
Вы можете сократить написание этих опций на одну `-c copy` которая обьеденяет все три опции.
Но учтите если вы хотите сделать к примеру видео без субтитров вам следует прописать нужные опции `-c:v copy` `-c:a copy` и не прописывать `-c:s copy`
:::

::: info
Справка по обозначению опций `-map 0:v:0` `-map 0:a:0` `-map 0:s:0`

```shell
Изменять -map 0:v:0 не рекомендуется так как видео файлы могут содержать в себе определённые обложки и программа за основу может взять не само видео а обложку (картинку)
Изменяя -map 0:a:0 мы выбираем какую аудио дорожку скопировать (-map 0:a:0 первая по порядку, -map 0:a:1 вторая, -map 0:a:2 третья и так далее)
Изменяя -map 0:s:0 принцип схож с аудио дорожками (-map 0:s:0 первая по порядку, -map 0:s:1 вторая, -map 0:s:2 третья и так далее)
```
:::

##Вывод названия кодека, количество каналов аудио, язык и название аудио дорожки.

## Вывод названия аудио кодека, количество каналов аудио, язык и название аудио дорожки.

```shell
for file in *; do
echo "Файл: $file"
ffprobe -v error -select_streams a -show_entries stream=codec_name,channels,tags:stream_tags=language,title -of csv=p=0 "$file"
done
```

## Как загрузить короткое видео без звука в Telegram чтобы оно сохранилось как видео а не конвертировалось в GIF
ffmpeg -f lavfi -i aevalsrc=0 -i "Файл.mp4" -map 0 -map 1:v -c:v copy -c:a aac -shortest "Файл2.mp4"

::: info
Общая информация к каждой из команд.
Вы можете указать название файлов без путей к ним но тогда вам нужно в терминале перейти в каталог где лежит изначальный файл.
Так же можно указать полные пути к примеру
ffmpeg -i "/путь/к/файлу/video_input.mp4" "/путь/куда/сохранить/video_output.avi"

0 comments on commit fb15dfe

Please sign in to comment.