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% файла есть, остальное отрезано..

★★★★★

Последнее исправление: LightDiver (всего исправлений: 2)

Про аудиофайлы не знаю, но у меня точно такая же хрень с битыми файлами с пустым концом (20-25%), когда я через цикл перегоняю видео, вырезая ненужные звуковые дорожки. Это, кстати, я обнаружил еще год назад, но тогда ничего не нашел. Так что к вопросу присоединяюсь.

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

Фух... Да, похоже оно не обрезает, а просто добавляет десятки (иногда) часов пустоты в файлы в конце. Теперь интересно как бы эту пустоту автоматом обрезать.

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

У меня щас подругой не на чем потестить, глянь у себя. Когда запускаешь ффмпег в кли отображается FPS. У меня при цикличной обработке он иногда зашкаливал. Например, на 30 ФПС видео, он мне отображал местами по 10к.

anonymous
()
Ответ на: комментарий от anonymous
Input #0, mp3, from '07_01_03.MP3':
  Duration: 00:03:32.40, start: 0.000000, bitrate: 256 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 256 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[libfdk_aac @ 0x561d1ffc4340] Note, the VBR setting is unsupported and only works with some parameter combinations
Output #0, adts, to 'convert/07_01_03.MP3.aac':
  Metadata:
    encoder         : Lavf57.71.100
    Stream #0:0: Audio: aac (libfdk_aac), 8000 Hz, mono, s16, 8 kb/s
    Metadata:
      encoder         : Lavc57.89.100 libfdk_aac
size=     486kB time=00:03:32.48 bitrate=  18.7kbits/s speed= 246x    
video:0kB audio:486kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
ffmpeg version 3.3.6 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.3.0 (Gentoo 7.3.0-r3 p1.4)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --docdir=/usr/share/doc/ffmpeg-3.3.6/html --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-O2 -march=x86-64 -pipe' --disable-static --enable-avfilter --enable-avresample --disable-stripping --disable-libcelt --enable-nonfree --disable-indev=oss --disable-indev=jack --disable-outdev=oss --enable-version3 --enable-nonfree --enable-bzlib --enable-runtime-cpudetect --disable-debug --disable-gcrypt --disable-gnutls --disable-gmp --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --enable-openssl --enable-postproc --disable-libsmbclient --enable-ffplay --enable-sdl2 --enable-vaapi --enable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --enable-libdc1394 --disable-libcaca --enable-openal --enable-opengl --disable-libv4l2 --enable-libpulse --enable-libopencore-amrwb --enable-libopencore-amrnb --enable-libfdk-aac --enable-libopenjpeg --disable-libbluray --disable-libgme --disable-libgsm --disable-mmal --disable-libmodplug --enable-libopus --disable-libilbc --disable-librtmp --disable-libssh --enable-libspeex --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-libbs2b --disable-chromaprint --disable-libflite --disable-frei0r --disable-libfribidi --disable-fontconfig --disable-ladspa --disable-libass --enable-libfreetype --disable-librubberband --disable-netcdf --disable-libzmq --disable-libzimg --disable-libsoxr --enable-pthreads --disable-libvo-amrwbenc --enable-libmp3lame --disable-libkvazaar --disable-nvenc --disable-libopenh264 --disable-libsnappy --enable-libtheora --disable-libtwolame --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --cpu=x86-64 --disable-doc --disable-htmlpages --enable-manpages
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
[mp3 @ 0x563e2801b340] Estimating duration from bitrate, this may be inaccurate
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Это надо риалтайм смотреть, в итоговом выводе может и не быть. И у меня такая шляпа была на видеофайлах. Попробуй, кстати, твой скрипт с видеофайлом, чтобы видеодорожку оставил, а аудио кодируй как нужно.

anonymous
()

Попробовал по твоей команде на своих файлах, та же байда, неправильно время файла показывает. То ли сам формат AAC не перваривает такой низкий битрейт, да ещё и с vbr, то ли особенность реализации libfdk_aac. Но, если тебе для аудиокниг, то нафига тебе aac? libspeex и время не портит и качество на слух заметно лучше

ffmpeg -i "$f" -c:a libspeex -vn -ar 8000 -ac 1 -b:a 8k convert/"${f/.mp3/.spx}"

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

Мне размер надо поменьше, а качество - главное чтобы смысл не терялся. Аас дает результат раза в полтора лучше, чем тот же мп3.

Ах да, ну и плеер не поддерживает почти ничего. Только MP3, WMA, AAC, WAV, PCM

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

Плеер поддерживает только MP3, WMA, AAC, WAV, PCM.

LightDiver ★★★★★
() автор топика

Практически каждый файл обрезан и концовки нет.

Тогда ffmpeg используй для распаковки, а для кодирования пользуй neroaacenc, либо falabaac.

PS: А при пользовании fdkaac для кодирования чего кажет?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Попробуй в скрипте поменять контейнер с *.aac на *.m4a. Согласно этому комментарию, так лучше. И это может решить твою проблему.

Также попробуй Nero AAC. Согласно этой информации (первые два предложения), он сжимает очень хорошо. Скачать можно здесь:

https://wiki.hydrogenaud.io/index.php?title=Nero_AAC

И там же можно взять скрипт, который конвертирует. Правда, в него придётся внести изменения:

  • *.flac поменять на *.mp3, да и вообще тебе вряд ли будет нужно кодировать именно поток stdin, поэтому можно кодировать просто файл. Тем более, что если кодировать из файла, а не потоком, то можно применить «двойной проход» - так написано в help этого кодировщика.
  • Изменить качество с 0.5 на то, что тебе нужно (сверься с табличкой по ссылке выше). Лично я внёс только два изменения: поменял путь до исполняемых файлов программы, а также убрал извлечение cover.jpg из файла FLAC, и вместо него использую свой файл обложки
--- convert-orig.sh	2019-04-19 14:42:31.762657445 +0700
+++ convert.sh	2019-02-27 11:34:47.972123619 +0700
@@ -5,8 +5,8 @@
 
 # Creates M4A versions of all FLAC in the current directory.
 
-AACENC="neroAacEnc"
-AACTAG="neroAacTag"
+AACENC="/home/zenitur/nero-aac/linux/neroAacEnc"
+AACTAG="/home/zenitur/nero-aac/linux/neroAacTag"
 TMPCVR="/run/shm/flac_cover.jpg"
 
 gettagvalue_metaflac () {
@@ -37,11 +37,6 @@
 	DATE=$(gettagvalue_metaflac "$f" "DATE")
 	GENRE=$(gettagvalue_metaflac "$f" "GENRE")
 
-	if [ -e "$TMPCVR" ]; then
-		rm "$TMPCVR"
-	fi
-	metaflac --export-picture-to="$TMPCVR" "$f"
-
 	fm4a=$(echo "$f" | sed s/\.flac$/.m4a/g)
 	flac -s -d -c "$f" | "$AACENC" -ignorelength -q 0.5 -if - -of "$fm4a"
 
@@ -57,9 +52,6 @@
 		-meta:totaldiscs="$DISCTOTAL" \
 		-meta:genre="$GENRE"
 
-	if [ -e "$TMPCVR" ]; then
-		"$AACTAG" "$fm4a" -add-cover:front:"$TMPCVR"
-		rm "$TMPCVR"
-	fi
+		"$AACTAG" "$fm4a" -add-cover:front:"cover.jpg"
 
 done
ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 2)
Ответ на: комментарий от ZenitharChampion
fm4a=$(echo "$f" | sed s/\.flac$/.m4a/g)

Жуть какая. Ненужный /g в ненужном sed'е с ненужным конвеером.

"${f/%.flac/.m4a}"

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

Unknown encoder 'fdkaac'

Это что? Вывод какой команды?

PS: Попробуй пошагово (без ffmpeg):

sox -S test.mp3 -c 1 -r 8000 test.wav
fdkaac -b 8 -m 1 test.wav
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

С m4a проблемы, вроде, нету на первый взгляд, но плеер то его не жрет.

А вообще с аас лютая дичь. Теперь на новой книге он генерирует файлы на 10 минут, в которых на самом деле 18 минут. То есть наоборот, вместо пустоты в конце - там теперь контент из ниоткуда. С м4а такого нет.

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

Кстати, в м4а конвертируется даже лучше. Совсем немного, буквально на 0,5мб из 45,5мб, но лучше. Только это не отменяет, что плеер таких не знает. В принципе, проблема чисто визуальная, информация то не теряется, но это надо еще проверить. Были ощущения несколько раз, что плеер обрывал воспроизведение файла.

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

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

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

Похоже плеер принял без проблем м4а, хоть официально о поддержке и не заявлено. Проблема собственно решена, в него и конвертируется лучше по размеру. По качестве разницы то нету.

Оригинал: 16.9 МиБ (17,685,943)

Аас: 2.4 МиБ (2,552,669)

М4а: 2.4 МиБ (2,527,533)

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

Проблема решена.

И всё-таки скомпиляй fdkaac для сравнения с neroaacenc. А заодно выяснишь в чём проблема, в fdkaac или ffmpeg.

PS: Сам для аудиокниг пользую opus, поддерживается mpd.

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

Ну, допустим, взял слаковский бинарник.

diver ~/UniP/1/input/Goethe__Faust_Radio_Rossii % sox -S 01.mp3 -c 1 -r 8000 test.wav                                                                           18:44:34

Input File     : '01.mp3'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:18:25.37 = 48746773 samples = 82902.7 CDDA sectors
File Size      : 17.7M
Bit Rate       : 128k
Sample Encoding: MPEG audio (layer I, II or III)

In:100%  00:18:25.35 [00:00:00.02] Out:8.84M [======|======] Hd:2.1 Clip:0    
Done.
diver ~/UniP/1/input/Goethe__Faust_Radio_Rossii % ./fdkaac -b 8 -m 1 test.wav                                                                                   18:44:43
[100%] 18:25.345/18:25.345 (559x), ETA 00:00.000   
8842762/8842762 samples processed in 00:01.979

Хренасе, а ведь результат еще лучше: 2.3 МиБ (2,389,720). Похоже надо его теперь встраивать в скрипт.

Спасибо, однако.

Однако теперь появилась проблема: скрипт то надо переделывать основательно, чтобы мусор сам удалял, например. Эх...

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

результат еще лучше

Следующий этап: использовать MP4Box для составления монолитной аудиокниги с оглавлением и попробовать, как плеер воспримет такой файл.

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

Нет смысла в монолите, плеер после подзарядки от ноутбука, например, сбрасывает воспроизведение в начало файла. И перемотку вообще не умеет в пределах одного файла.

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

Эм, я слегка озадачен.

sox -S «$f» -c 1 -r 8000 convert/$f;

01.mp3: MPEG ADTS, layer III, v2.5, 8 kbps, 8 kHz, Monaural

1.1 МиБ (1,105,560)

Просто прогнал его через sox как есть из мп3 в мп3 и результат в 2,5 раза лучше, чем со всей той ерундой через аас и м4а. Это как вообще?

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от Deleted

Да, но ффмпег в 2,5 раза хуже перегоняет в аас и м4а. И в мп3 он перегонял еще в два раза хуже, почему я и перешел на аас.

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

Да, но ффмпег

Ffmpeg не заточен под audio. Именно поэтому я аудио всегда обрабатываю отдельно от видео-потока и не в ffmpeg. Из-за этого же ни в коем случае нельзя пользовать faac в ffmpeg (уже правда неактуально, выпилили).

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

Короче, я в шоке.

Ффмпег из мп3 в мп3 делает 16 к 4.

Из мп3 в аас 16 к 2,4.

Фдкаас из wav в аас 16 к 2,3.

Sox из мп3 в мп3 16 к 1. Это вообще законно?

Собственно ушел от мп3 и пришел обратно на мп3, только теперь sox вместо ффмпег. Спасибо огромное за идею.

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

Спасибо огромное за идею.

Но работать будет только на аудиокнигах без «фона». 0-4kHz - слишком «глухой» диапазон (пользуется в телефонии). Некоторые книги потребуют 0-11kHz (-r 22050).

PS: Для скрипта рекомендую параметр rate вынести в аргументы (хотя какой тут скрипт, одна команда).

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

Ну как сказать. Вот пример.

Даже не знаю, стоит улучшать или нет.

Кажется я нашел оптимальное. На 11050 потерь качества вообще не заметно, а по размеру оно в два раза меньше, чем через ффмпег было на 8000.

пример.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

На 11050 потерь качества вообще не заметно

11050? А такой поддерживается? Хмм. Я знаю 44100, 22050, 16000, 8000. А вот 11050 не знаю. А по примеру - для меня глуховат, но я всегда «грубость» mp3 кодека воспринимал с трудом (особенности слуха). Если бы твой плеер играл OGG, вот здесь «эффект» был бы вообще «потрясающий».

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

Вот, нашел в вики:

8 000 Гц — телефон, достаточно для речи, кодек Nellymoser;

11 025 Гц — четверть Audio CD, достаточно для передачи речи;

22 050 Гц — половина Audio CD, достаточно для передачи качества радио;

И да, ошибся, 11025, конечно же.

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

Sox офигеть какой умный, однако. Я вот опечатался, а он ошибку не выдает. Он просто подгоняет под ближайшее правильное сам.

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

./fdkaac -p 2 -b 11 -m 0 001.wav

С постоянным битрейтом разница в пользу аас, однако. 600.5 КиБ (614,876) против 839.9 КиБ (860,056). Это на 11025.

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

Итак, я смог настроить самый мелкоразмерный файл, который вполне комфортно слушать, однако... Возвращаемся к первой проблеме - это опять .аас и проблемы со временем воспроизведения. Хехе...

sox -S 01.mp3 -c 1 -r 11025 001.wav

./fdkaac -p 2 -b 11 -m 0 --transport-format 2 001.wav

577.7 КиБ (591,561)

Это рекорд - сжатие в 17,442 раза.

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

А sox m4a не умеет, да?

Ни m4a, ни aac. Да.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.