LINUX.ORG.RU

Замедлить звук в фильме с помощью mencoder


0

1

Есть фильм, в котором звук и видео не синхронизированы. В начале расхождение порядка 4,5 с, к середине оно превышает 100, думаю дальше будет ещё больше. Как замедлить звук? Не обязательно mencoder-ом.

Формат видео mplayer опознаёт как FLV1, аудио -- как MPEG layer-2, layer-3.

Как разделить звук и видео командами -dumpaudio и -dumpvideo я понял. А как замедлить звук и потом их объединить?

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

Определите сначала причину отставания звука. Возможно поможет такое:

mplayer -autosync 30 film.avi

mplayer -forceidx film.avi

mplayer -nobps film.avi

Или комбинации опций.

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

> Возможно поможет такое:

Не помогло.

> Определите сначала причину отставания звука.

Насколько я понял, скорости звуковой дорожки и видео в файле различаются. Программа показывает расхождение a-v близкое к нулю, но к середине фильма звук отстаёт от изображения секунд на 100. Чтобы его смотреть, я запустил звук в другом мплеере и время от времени останавливал воспроизведение фильма, чтобы звук его нагонял.

Вопрос сводится к следующему: как замедлить в 1,04 раз mp3-файл и затем вклеить его в flv-контейнер. Желательно без перекодирования видео, качество там невысокое.

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

Попробую предположить, что:

mplayer -af scaletempo=speed=1.04 video.avi

Я не могу сейчас попробовать результат. Есть сомнения в том, что:

1. Воспринимается только один знак после точки в параметре speed.

2. Увеличит скорость воспроизведения и для видео тоже.

Во втором случае разъединенные дорожки можно соединить так:

mencoder -audiofile audio.mp3 -oac mp3lame -ovc copy -o video_out.flv video_without_audio.flv

Попробовать, что получится ДО кодирования можно с той же опцией -audiofile, но в комплекте с mplayer:

mplayer -audiofile audio.mp3 video.flv

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

> mplayer -af scaletempo=speed=1.04 video.avi

Пишет:

[scaletempo] ошибка анализа командной строки: значение вне допустимого диапазона: speed=[pitch|tempo|none|both]
[libaf] Couldn't create or open audio filter 'scaletempo'

-af scaletempo=scale=2 ускоряет и видео тоже.

> mencoder -audiofile audio.mp3 -oac mp3lame -ovc copy -o video_out.flv video_without_audio.flv


Уже пробовал с неускоренным звуком (и с -oac mp3lam, и с -oac copy), записывает первые 107 секунд, затем пишет

Слишком много (4096 в 1172061 байтах) аудиопакетов в буфере!
Возможно Вы проигрываете 'неслоёный' поток/файл или неудачный кодек?
Для AVI файлов попробуйте форсировать 'неслоёный' режим опцией -ni.
Запись индекса...
Запись заголовка...
ODML: Aspect information not (yet?) available or unspecified, not writing vprp header.

Поток видео: 276.225 кбит/с (34528 Б/с) размер: 3683464 байт(а/ов) 106.680 сек. 2675 кадр(а/ов)

Поток аудио: 137.353 кбит/с (17169 Б/с) размер: 1840199 байт(а/ов) 107.180 сек.

Добавление -ni не помогает.

Формат контейнера при такой записи получается не FLV, а AVI, но это, в принципе, безразлично.

Что делать?

Нужной скорости воспроизведения я добился ключом -speed 1.05 (искажение частоты несущественно), но никак не разберусь как записать результат в файл. Когда я пишу

mencoder audio.mp3 -speed 1.05 -o fast.mp3

он пытается записать его в контейнер AVI и ругается на отсутствие видеопотока. Видео он требует и с другими выходными форматами: -of lavf, -of mpeg и даже -of rawaudio.

Заодно спрошу: существует ли способ заставить mplayer правильно определять длину MP3-файла с переменным битрейтом? Как я понял, он определяет её, считая битрейт в самом начале постоянным для всего файла. -forceidx не помогает.

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

>В:

>Как перекодировать звуковой файл (без видео)?

>О:

>Используйте aconvert.sh из подкаталога TOOLS дерева каталогов MPlayer.

Это по поводу кодирования аудио отдельно.

-----------------------------------------------------------------

>Если MPlayer часто жалуется на

>Too many video/audio packets in the buffer

>или если вы заметили растущую рассинхронизацию между звуком и видео проверьте наличие PCR pid'а в вашем потоке (требующегося для соблюдения >модели буферизации передатчика) и/или попробуйте воспользоваться >libavformat MPEG-TS декодером, добавив -demuxer lavf -lavfdopts >probesize=128 в командную строку.

Это по поводу ошибок.

-----------------------------------------------------------------

И все оно отсюда:

http://www.mplayerhq.hu/DOCS/HTML-single/ru/MPlayer.html

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

Спасибо, но

> попробуйте воспользоваться libavformat MPEG-TS декодером, добавив -demuxer lavf -lavfdopts probesize=128 в командную строку.

Эта рекомендация относилась к AVI. Не помогло. Для FLV рекомендуют писать -correct-pts или вручную указывать -fps ... . Ещё раз повторю: рассинхронизация произошла при создании файла.

> aconvert.sh

Не работает с переменными битрейтами. Ковыряю...

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

Правильный способ записать аудио без видео:

mencoder -demuxer rawvideo -rawvideo w=1:h=1 -ovc copy -of rawaudio -endpos ???? -audiofile infile.mp3 -o outfile.mp3 -oac mp3lame -lameopts abr:br=56 -srate 22050 -speed 1.06 infile.mp3

-endpos в aconvert.sh определяется хитрым скриптом

`mplayer -identify audio.mp3 -frames 0 2>&1 | grep ID_LENGTH | cut -d "=" -f 2`

который на VBR ошибается на 1-2 порядка.

Похоже, aconvert.sh не работал из-за того, что теперь нужно явно указывать -oac. Параметры -lameopts взял из рекомендуемых для FLV.

Дважды указывать входной файл необходимо.

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