LINUX.ORG.RU

FFMPEG портит файлы.

 ,


2

1

Перегоняю аудио-файлы через ffmpeg скриптом:

#!/bin/sh
mkdir convert
for f in *.mp3;
do
ffmpeg -i "$f" -c:a libfdk_aac -vbr 1 -vn -ar 8000 -ac 1 -q:a 1 -b:a 8k convert/$f.aac;
done 

Внезапно оказалось, что последние 10-20% файлов пустые. Даже не пустые, а файлы битые. За 10-20% до окончания файла воспроизведение прерывается. Практически каждый файл обрезан и концовки нет. Почему это и как этого избежать?

У некоторых файлов вообще остается только самое начало. Первые 10% файла есть, остальное отрезано..

Ответ на: комментарий от zvezdochiot

я аудио всегда обрабатываю отдельно от видео-потока и не в ffmpeg

Можно поиметь рассинхрон, единственный способ его избежать - извлекать с такими параметрами:

ffmpeg -i video.mkv -c:a pcm_f32le -async 1 audio.wav

Правда на совсем уж извращенных файлах (например, с перетяжкой pal<>ntsc средствами контейнера) будут щелчки.

Я тоже думал, что аудиокниги (синтезированные) легко сжимать. Но оказалось, что это не так. Чем проще сигнал, тем сильнее заметны искажения. Сжимал PCM 22кГц моно 16 бит в Nero AAC 33кбит/с - звук стал жестким (я узнал это потом, сравнив). QAAC глухим (резать ВЧ он перестает с 40-45кбит/с). FDK получше. Opus тоже как-то не пошел, ВЧ неприятные, а их и так немного. А тут еще проблема ресемплинга 22>48 в железе. Дошел до того, что стал сохранять во FLAC 48кГц 24 бит (с sox ресемплером), ну или хотя бы Nero AAC 128кбит/с 22кГц моно. Впрочем, слушать на портативе в наушниках все равно не вариант - слишком хорошо слышны шумы устройства.

Кстати, вместо -ar 8000 лучше указать:
-af aformat=sample_fmts=flt,aresample=8000:resampler=soxr:precision=28

А FDK хоть и хороший кодер, но его нет в дефолтной поставке ffmpeg и он поддерживает только 16 бит - может быть клиппинг.

nakita ()
Ответ на: комментарий от zvezdochiot

Если декодируешь ac3/dts дорожки, чтобы не было компрессии динамического диапазона, надо добавлять (перед -i):

ffmpeg -drc_scale 0 -i input.mkv(ac3)...

Вообще, на линуксе все плееры по умолчанию используют компрессию ac3 (если она прописана в потоке, а это часто бывает, вот в dts редко). Отключается так:
1. SMPlayer с mpv
Настройки-Дополнительно-Параметры mpv-верхняя строчка «настройки» (не видео/аудио, а общие) дописать:
--ad-lavc-ac3drc=0

2. SMPlayer с mplayer
Тоже самое, но вписать
-a52drc 0

3. VLC
Инструменты-Настройки-Показывать все-Ввод/кодеки-Аудиокодеки-A/52-Снять галочку «сжатие динамического диапазона» (этой настройки нет во Flatpak VLC)

Проверить наличие drc в ac3 можно в mediainfo -full file.mkv(ac3)
Параметр dialnorm. Если он -31dB, значит компрессии нет. Если выше, например -27dB, значит есть. Убрать ее можно также без пересжатия, но в виндовом консольном eac3to:
eac3to input.ac3 output.ac3

Чем плоха компрессия? Экшн сцены смотрятся неэффектно, как по ТВ.

nakita ()
Ответ на: комментарий от nakita

Эх, раньше я RHVoice использовал. Идеально было практически. Только я Елену предпочитал. Более гладко, однако. А потом из него выкинули плеер и теперь непонятно как его вообще и куда тыкать для синтезации.

LightDiver ★★★★★ ()
Ответ на: комментарий от nakita

Nero AAC 128 кбит/с

Хинт: если ему указать 320 кбит/с (максимум, доступный в балаболке), на простых сэмплах он все равно кодит в 129 кбит/с (пики 138 кбит/с). Зато гарантия, что из кодера выжат максимум.

nakita ()
Ответ на: комментарий от zvezdochiot

RHVoice Александр мне тоже нравится, немного монотонный, правда. Только качество звука не очень. Особенно в старых пакетах, если не собирать самому. И он, наверное, не умеет на больших скоростях сохранять.

nakita ()
Ответ на: комментарий от LightDiver

Сейчас самые крутые технологии у яндекса https://webasr.yandex.net/ttsdemo.html (онлайн синтез).
Люди умудряются сохранять книги через их API, публичный доступ вообще хотели прикрыть, но пока работает. По мне, читают хорошо, но голоса какие-то недобрые.

nakita ()
Ответ на: комментарий от LightDiver

Видимо кривыми руками не дошел до правильной команды.

Нет. Он неудобен. Проще использовать интерфейс RHVoice через speech-dispatcher (входит в оригинальную сборку). Для orca удобно, но для консоли - нет. Поэтому и патчил архивы, и плевать, что сервер не закрывается, htop никто не отменял.

zvezdochiot ()
Ответ на: комментарий от zvezdochiot

Хм.. Есть идея разбивать большие файлы автоматом на несколько мелких. А то вот смотрю я сейчас - 2,5-3 часа на файл. С багом, который в аас это нужно каждый прослушать без выключения плеера, иначе каждый раз начинать с нуля.

LightDiver ★★★★★ ()
Ответ на: комментарий от LightDiver

С багом, который в аас это нужно каждый прослушать без выключения плеера, иначе каждый раз начинать с нуля.

Выбери один с багом (покороче) и попробуй на нём MP4Box. Мне с моим плеером это помогло.

zvezdochiot ()
Ответ на: комментарий от zvezdochiot

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

LightDiver ★★★★★ ()
Ответ на: комментарий от LightDiver

Почему бы не кодить в WinFF? В нем можно создавать свои пресеты, я так вообще все встроенные удалил, а ffmpeg указал свой. Единственное неудобно папку с подпапками закидывать.

LightDiver
Попробуй ffmpeg static https://ffmpeg.org/download.html в нем правда нет fdk, но встроенный aac достаточно хорош, хотя и невероятно медленный, но вдруг в нем не будет бага.

nakita ()
Ответ на: комментарий от nakita

Родной aac кодировщик от ffmpeg.

encoders: aac libfdk_aac

Первый, что ле? Хмм.

У меня проблемы с плеером были не из-за кодера, а из-за ffmpeg-овского контейнера.

PS: да и не только с плеером, но и с mpd.

zvezdochiot ()
Последнее исправление: zvezdochiot (всего исправлений: 1)
Ответ на: комментарий от buka14

Декодировать желательно в той проге, которая поддерживает декодирование в 32 bit float (позволяет избежать клиппинга), это, например, ffmpeg последних версий и той, которая поддерживает gapless (актуально для live альбомов, насчет ffmpeg не уверен, но вроде он не поддерживает gapless).

nakita ()
Ответ на: комментарий от nakita

Еще надо понизить громкость.

Фига себе, кто бы мог подумать? А я думал именно это главное условие. Наверное ошибся, да?

Но декодируя в 16/24 бит сигнал уже безнадежен.

$ madplay -G -o Test\ clipping.mp3.wav Test\ clipping.mp3

Полностью с вами «согласен», прям-прям.

zvezdochiot ()
Ответ на: комментарий от zvezdochiot

Ну что ты мне суешь свою ерунду? Значит он декодирует в 32 bit float, понижает уровень и обрезает до 16 бит.

При ДЕКОДЕ 16 и 24 FIXED point сигнал в принципе не может быть выше 0, все что выше 0 обрезается, учи матчасть что такое FIXED point и что такое декодирование и DSP.

nakita ()
Ответ на: комментарий от nakita

Значит он декодирует в 32 bit float, понижает уровень и обрезает до 16 бит.

Зачем?

При ДЕКОДЕ 16 и 24 FIXED point сигнал в принципе не может быть выше 0

Это зависит от конкретного алгоритма, а никак не от битности. Сам учи матчасть.

PS: И твоё исчисление в dB кое о чём говорит.

zvezdochiot ()
Последнее исправление: zvezdochiot (всего исправлений: 3)
Ответ на: комментарий от buka14

кодеком воспроизведения wav и mp3 в плеере.

??? (wav - нет такого кодека, pcm с «шапкой», mp3 - декодирование согласно публичной спецификации).

Из-за чего может ухудшаться качество после распаковки

??? (качество теряется во время фильтрации при кодировании, а не наоборот, при декодировании).

zvezdochiot ()

Интересная однако тема...

В изначальном варианте заметил любопытную штуку:

[libfdk_aac @ 0x561d1ffc4340] Note, the VBR setting is unsupported and only works with some parameter combinations
Т.е. потом этот кодек вообще не используется, но всё таки, надо внимательней читать что он пишет.

А вот мой страшный скрипт для похожей цели: перекодировать дерево с музыкой, все результаты побросать в одну папку. Из плюсов: как никак, но реализована многопоточность. И кодирование одного файла вынесено в отдельный скрипт. Может что полезное найдёте.

#!/bin/bash
CORE="5" # Создавать потоков

if [ "$1" = "-h" ]; then
echo 'Использование: conv.bash <каталог для поиска файлов> <каталог для помещения результатов>'
exit 0
fi
if [ "$1" = "--help" ]; then
echo 'Использование: conv.bash <каталог для поиска файлов> <каталог для помещения результатов>'
exit 0
fi

rm -R /tmp/ffmpeg/
rm /tmp/convert.bash
mkdir /tmp/ffmpeg/
id='1' # Начальный индекс файла
cd "$1"
mkdir "$2"
ALL=$( find -P ./ -type f | wc -l )

	# Создание второстепенного скрипта /tmp/convert.bash
	# $1 - id файла. $2 - путь к папке, куда надо положить результат. Файлы блокировок расположены в /tmp/ffmpeg/, имя = id, содержится строка с отн. адресом файла на перекодирование.
echo 'ALL=$( find -P ./ -type f | wc -l )' >> /tmp/convert.bash
echo 'FILE=$( cat /tmp/ffmpeg/$1 )' >> /tmp/convert.bash
echo 'DIR=${FILE%/*}' >> /tmp/convert.bash
echo 'LONG_DIR=${#DIR}+1' >> /tmp/convert.bash
echo 'NAME=${FILE:LONG_DIR}' >> /tmp/convert.bash
echo 'FILENAME=${NAME%.*}' >> /tmp/convert.bash
#echo 'ffmpeg  -i "$FILE" -vn -acodec mp3 -aq 6 -ac 1 "$2"/"$FILENAME".mp3 > /dev/null 2>&1' >> /tmp/convert.bash
echo 'ffmpeg  -i "$FILE" -vn -acodec mp3 -aq 4 "$2"/"$FILENAME".mp3 > /dev/null 2>&1' >> /tmp/convert.bash
echo 'rm /tmp/ffmpeg/"$1"' >> /tmp/convert.bash
echo 'echo $1 из $ALL завершено' >> /tmp/convert.bash
chmod +x /tmp/convert.bash
	# Конец создания второстепенного скрипта

		find -P ./ -type f | while read FILE
		do
while [ $( ls -1A /tmp/ffmpeg | wc -l ) -ge "$CORE" ]; do
	sleep 10
done

echo "$FILE" >> /tmp/ffmpeg/"$id"
/tmp/convert.bash "$id" "$2" &
echo $id'/'$ALL" кодируется ""$FILE"
let id++

		done
kirill_rrr ★★★★★ ()
Ответ на: комментарий от zvezdochiot

Зачем?

16 бит ходовой формат, ffmpeg тоже в него декодит по умолчанию.
Зачем понижает громкость? - Применяет ReplayGain, откуда-то информация о нем взялась в файле mp3 (причем видно ее только в ffmpeg, может в ape тегах [поиск ape на странице]). Ну а ReplayGain работает в pcm_f32le, как и ффмпеговский фильтр -af volume.
ffmpeg недавно стал mp3 декодировать в 32 bit float (см. надпись на входе fltp, раньше было s16), но сохраняет в s16, если ему явно не задать нужный формат.

Это зависит от конкретного алгоритма

Ну, мне не встречались еще такие, которые обходили клиппинг в 16/24 бит. Тоже задавался эти вопросом, но похоже это невозможно. Хотя уровень lossy файлов можно уменьшить без перекодировки, это умеет mp3gain, переписав значение амплитуды сэмплов (для mp3 точность/шаг 1.5 дБ) тогда в принципе декодер может провернуть такой финт, а потом декодировать 16 бит без клиппинга, но повторюсь, я с таким не сталкивался. Именно, чтобы декод был в 16 бит, а не потом к нему приводили после обработки. Многие декодят в 16 бит с клиппингом: Winamp, WMP те же. Только на реальных сэмплах это услышать трудно, чем сложнее сигнал, тем сильнее маскируются искажения.

anonymous ()