Показаны сообщения с ярлыком ffmpeg. Показать все сообщения
Показаны сообщения с ярлыком ffmpeg. Показать все сообщения

среда, 30 октября 2013 г.

FFMPEG - траблы с порядком аргументов в командной строке

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

Вырезаю кусок из видеофайла так:
ffmpeg -ss 01:04:53 -t 00:01:25 -i input.mp4 output.mp4
Обработка вырезаемого куска начинается сразу же, создается output.mp4, реального видео в нем 1 мин 25 сек, но проигрыватель VLC почему то показывает, что там 11 мин 27 сек. и MkvMerge отказывается соединять этот файл с другим вроде такого же формата. Воспроизведение в VLC впрочем автоматически прекращается через 1 мин 25 сек.

Если же сделать так:
ffmpeg -i input.mp4 -ss 01:04:53 -t 00:01:25 output.mp4
то ffmpeg некоторое (довольно длительное) время вхолостую пережевывает входной файл со 100% загрузкой процессора, такое впечатление, что так он подбирается к отметке в 1 час 4 мин 53 сек, с которой надо начать вырезать фрагмент и только потом начинает реально выкусывать нужные 1 мин 25 сек. Зато никаких проблем ни с отображением длительностьи выходного файла, ни с его объединением в MkvMerge.

суббота, 26 октября 2013 г.

Как скачать видео со sportbox.ru

Да собственно также как с onlinetv.ru :)

Берём RTMPDumpHelper и RTMPDump и распаковываем все в один каталог.

Запускаем RTMPDumpHelper.exe, он автоматически ставит на прослушку все обращения на порт 1935 и запускает rtmpsuck.exe из комплекта RTMPDump, которому будет их переадресовывать.



Запускаем Firefox, открываем страницу с видео, например http://news.sportbox.ru/Vidy_sporta/edinoborstva/spbvideo_NI409958_Kendo-Vsemirnie-igri-boevih-iskusstv-Deni-3.
В браузере смотрим видео, а в окне rtmpsuck.exe видим параметры обращения к RTMP серверу, в отличии от online.tv здесь запрос один, без переадресовки:
...
Processing connect
app: xarvod/_definst_
flashVer: WIN 11,9,900,117
swfUrl: http://news.sportbox.ru/sites/all/libraries/spb_movie/_spbver_/player.swf
tcUrl: rtmp://sportbox-vod.cdn.ngenix.net:1935/xarvod/_definst_
pageUrl: http://news.sportbox.ru/vdl/player?nid=409958
Playpath: services/ngenix_validator?id=20131018135417_kendovsemirnyjeigrybojevyhiskuss_2_001.mp4/MTM4Mjc2NzA1OS9iMDc5MDk4YzNhLzg1MTJiYjI0NTczMWU3YjU1YTFkNDhjMmEwODhjNGQyMTkyODRmODA=
Saving as: ngenix_validator
WARNING: ignoring too small audio packet: size: 0
INFO: Metadata:
...

В это же время проигрываемое видео автоматически сохраняется в файл, но поскольку процесс длительный есть риск случайно закрыть одну из программ, участвующих в процессе и придется начинать всё сначала, поэтому я предпочитаю скопировать параметры tcUrl, Playpath и swfUrl из окошка rtmpsuck.exe в команду для FFmpeg:
ffmpeg -i "rtmp://sportbox-vod.cdn.ngenix.net:1935/xarvod/_definst_ \
Playpath=services/ngenix_validator?id=20131018135417_kendovsemirnyjeigrybojevyhiskuss_2_001.mp4/MTM4Mjc2NzA1OS9iMDc5MDk4YzNhLzg1MTJiYjI0NTczMWU3YjU1YTFkNDhjMmEwODhjNGQyMTkyODRmODA= \
swfUrl=http://news.sportbox.ru/sites/all/libraries/spb_movie/_spbver_/player.swf" -c copy kendo_1_001.mp4

Через час нужное видео будет на диске.

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

четверг, 8 августа 2013 г.

FFMPEG - Crop и Slow Mo

Прикопаю еще одну фишку FFmpeg - вырезание в отдельный файл части экрана исходного видео (crop) и уменьшение скорости воспроизведения (slowmo).

Есть такое видео с дурацкой ориентацией кадра:



Можно скачать его в разрешении 1080 и вырезать центральную часть 640x480, в которой собственно всё и происходит, это достаточно просто (-vf crop=640:480):

ffmpeg -i "Chiba sensei seminar 01.mp4" -vf crop=640:480 -b:v 3000K "01chiba.mp4"

Хотя, если нужно только получить в замедленном виде один фрагмент, можно все действия сразу запихать в одну команду:

ffmpeg -ss 00:01:42 -t 00:00:01 -i "Chiba sensei seminar 01.mp4" -qscale 0 -vf crop=640:480 -f yuv4mpegpipe - | \
yuvfps -s 1:20 -r 1:1 | yuvfps -r 30:1 -c | \
ffmpeg -f yuv4mpegpipe -i - -qscale 0 koteslowlQ.mp4
  • -ss 00:01:42 -t 00:00:01 - берем только одну секунду, начиная с 1 мин 40 сек исходного видео
  • -qscale 0 - качество видео не трогаем
  • -vf crop=640:480 - вырезаем из центра область 640х480
  • -f yuv4mpegpipe - задаем формат, в котором видео отправляется по конвейеру
  • yuvfps.exe - утилитка из комплекта MJpeg tools
  • -s 1:20 -r 1:1 - на каждую 1/20-ю часть "входящих" кадров создаем 1 полный кадр нового видеопотока
  • -r 30:1 - говорим, что новый видеопоток будет со скоростью 30 кадров в сек
  • и последней частью команды ffmpeg собирает из видеопотока идущего по конвейеру файл в формате mp4.
Обратные слэшики лучше выкосить (не все файловые менеджеры их понимают) и набирать команду в одну строку.

Результат команды в файле koteslowlQ.mp4 - центральная часть исходного кадра, 1 сек в замедленном виде:



А вот для сравнения изделие другой, спец. утилитки для slow mo - slowmoVideo, она умеет растягивать разные интервалы исходного видео с разной скоростью, в соответствии с заданными настройками, для её работы тоже кстати требуется FFmpeg



и к тому же не просто размножает каждый кадр, а пытается сделать между кадрами плавные переходы, получает забавно:

четверг, 28 марта 2013 г.

Как вырезать кусок из видео

Программ, которыми можно вырезать из видео нужный кусок на самом деле вагон и маленькая тележка, но одни платные, другие открывают только видеофайлы определенного типа (например, только avi) или только использующие определенные кодеки, к третьей привыкнешь под windows, а под linux её не окажется. Чтоб не морочить себе голову всякой ерундой, проще всего запомнить одно универсальное бесплатное решение под windows, mac и linux - командную строку FFMPEG.

В простейшем случае она будет выглядеть так (вырезать из input.mp4 начиная с момента в 1 мин 9 сек кусок в 10 мин и положить в output.mp4 без перекодировки):
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -c copy output.mp4

Но здесь есть одна засада - кодеки, сжимающие видео пишут один полный видео кадр (опорный), а потом несколько кадров с информацией только об изменившихся кусочках опорного кадра, потом снова опорный кадр полностью и т.д. Вырезая кусок с опцией -c copy ffmpeg может (и скорее всего так и сделает) начать видео файл output.mp4 с нескольких неполных кусков кадров без опорного кадра перед ними. При просмотре это будет выглядеть как секунда мусора в начале видео, проигрыватели видео ее без проблем пережевывают.
Собственно засада будет если попытаться выложить вырезанный кусок на какой-либо видеохостинг - после закачки будет выдано сообщение об ошибке при обработке видеофайла с адекватностью обратно-пропорциональной пофигизму программиста, который писал эту обработку - от вполне понятного на youtube до полностью дебильного на facebook-е. Сам ffmpeg, кстати, такие файлы тоже обычно потом пережёвывать не может - ругается на неправильные пикселы в первом видеокадре.

Полечить этот неприятный момент можно включив одновременное пережатие вырезаемого куска (тип кодеков в данном случае задается расширением выходного файла - mp4):
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 output.mp4

а лучше так:
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -b:v 3000K -acodec libmp3lame output.mp4

поднятие битрейта видео (-b:v 3000K) по сравнению с используемым по умолчанию позволяет получить более приличное качество (конечно если у исходного видео битрейт был больше 3000K), а с кодеком звука mp3 почему-то никогда не возникает дефекта постепенной рассинхронизации видео и аудио, который нет-нет да и вылезает при таких манипуляциях и использовании других аудиокодеков.

Если надо одновременно поменять разрешение вырезаемого куска, добавляем опцию -s:
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -s 1280x720 -b:v 3000K -acodec libmp3lame output.mp4

Если исходное видео содержит несколько аудио дорожек и/или субтитры, нужно будет указать номера всех дорожек, которые нам нужны в выходном файле:
ffmpeg -i input.mkv -ss 00:01:09 -t 00:10:00 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -s 1280x720 \
-b:v 3000K -acodec libmp3lame -scodec copy output.mkv

-map задает перечень и порядок дорожек, которые нужны в выходном файле, а -scodec copy копирование субтитров без перекодировки.

воскресенье, 10 февраля 2013 г.

Как загрузить видео с OnlineTV.ru - 2 (попроще)

Способ распотрошить обмен браузера и RTMP-сервера при помощи wireshark рабочий, но это, так сказать, тяжелая артиллерия. В принципе в комплекте RTMPDump есть утилита-прокси сервер rtmpsuck.exe, которая, если на нее перенаправить запросы браузера "наружу", на порт 1935, выдаст все параметры, с которыми браузер запрашивает данные по RTMP. В описании есть и пример команды, как это перенаправление сделать средствами linux. Под windows средствами OS это сделать затруднительно, но зато есть RTMPDumpHelper от NirSoft. RTMPDumpHelper пытается внедрить свою dll во все процессы, использующие интернет, отлавливает обращения на порт 1935, перенаправляет их на rtmpsuck.exe, а ответ, который возвращает rtmpsuck.exe передает обратно в процесс браузера.

Итак, качаем RTMPDumpHelper и RTMPDump и распаковываем все в один каталог.

Запускаем браузер, открываем страницу с видео, например http://www.onlinetv.ru/video/643/.
Запускаем RTMPDumpHelper.exe, RTMPDumpHelper автоматически ставит на прослушку все обращения браузера на порт 1935 и запускает rtmpsuck.exe из комплекта RTMPDump, которому будет их переадресовывать.
Запускаем на просмотр видео. В браузере смотрим видео, а в окне rtmpsuck.exe видим параметры первоначального обращения и второго, после переадресовки:



В это же время проигрываемое видео автоматически сохраняется в файл, но можно и скопировать параметры из окошка rtmpsuck.exe в команду для FFmpeg, чтобы например, создать файл только со звуком:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/32/643/petrovic_hq.mp4 \
playpath=mp4:onlinetv/32/643/petrovic_hq.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-vn petrovic.mp3

или видео полностью:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/32/643/petrovic_hq.mp4 \
playpath=mp4:onlinetv/32/643/petrovic_hq.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-c copy petrovic.mp4

з.ы. К сожалению RTMPDumpHelper иногда падает и при этом его dll остается загруженной в кучу процессов :(, но что еще хуже, после одного падения RTMPDumpHelper уже невозможно нормально запустить, он начинает падать сразу после запуска, и так до перезагрузки компьютера.

четверг, 7 февраля 2013 г.

Как скачать видео или звук с OnlineTV.ru

Не люблю я смотреть видео на сайтах, а самый любимый жанр, всяческие разговоры, вообще смотреть особого смысла нет, предпочитаю слушать с плейера по пути на работу/ с работы. Поэтому, когда на OnlineTV.ru появилась Вся правда о... происхождении человека с доктором биологии Александром Марковым, а кнопки Скачать не обнаружилось, пришлось немножко поковыряться внутрях OnlineTV.ru и найти способ получить вожделенный mp3, ну и mp4 если надо.

Загружать потоковое видео по протоколу RTMP умеют спец.утилитка RTMPDump, ну и, сюрприз, сюрприз :) FFmpeg. Но просто по-тупому взять из исходников страницы http://www.onlinetv.ru/video/665/ свойства плейера streamer: "rtmp://cdn0.onlinetv.ru:1935/onlinetvload/", file: "onlinetv/19/665/evolution.mp4,onlinetv/19/665/evolution_hq.mp4" и подсунуть этим утилиткам не получится, во-первых, серверу, кроме адреса файла надо подсовывать еще дополнительные поля, а во-вторых, как оказалось файлы лежат по другому адресу.

Попытка поковырять обмен браузера и сервера при помощи Microsoft Network Monitor обломалась :( т.к. не смог найти для него парсер RTMP, а без парсера протокола все RTMP пакеты Microsoft Network Monitor показывает как голимый TCP - ничего не поймёшь.

Зато, как оказалось, хорошо показывает RTMP Wireshark. Запускаем Wireshark, включаем слежение, ставим фильтр rtmpt, обновляем страницу http://www.onlinetv.ru/video/665/, запускаем просмотр видео, видим сначала connect по первоначальному адресу, потом connect после переадресации и реальный адрес rtmp://, запомним также свойство swfUrl, пригодится:



несколькими строками ниже - команда play с реальным адресом файла:



Из распотрошенных данных можно составить команду на загрузку при помощи RTMPDump:
rtmpdump.exe --rtmp "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4" \
--playpath "mp4:onlinetv/19/665/evolution.mp4" \
--swfUrl "http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-o evolution.flv
(если что-то не идет можно добавить ключик --verbose, чтоб получить побольше информации), или при помощи FFmpeg:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4 \
playpath=mp4:onlinetv/19/665/evolution.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-c copy evolution.mp4
Собственно FFmpeg'ом можно создавать сразу mp3:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4 \
playpath=mp4:onlinetv/19/665/evolution.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-vn evolution.mp3

Вуаля! Дальше, пока разработчики сайта OnlineTV.ru что-нибудь не поменяют, можно так глубоко не потрошить, а брать из исходников страницы, например http://www.onlinetv.ru/video/658/, адрес файла file: "onlinetv/32/658/hakamada.mp4,onlinetv/32/658/hakamada_hq.mp4" и составлять команду для загрузки:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/32/658/hakamada_hq.mp4 \
playpath=mp4:onlinetv/32/658/hakamada_hq.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-c copy hakamada_hq.mp4

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

UPD: А вот ещё вариант.

воскресенье, 13 января 2013 г.

Как порезать ape/cue на mp3

Опять вспоминал полчаса то, что уже делал когда-то :( придется записать ;) Итак, есть аудиодиск, сграбленный в ape/cue, надо его порезать на отдельные песни в mp3 для портативного плейера.

1. Весь трек перегоняем в mp3 при помощи FFmpeg:
ffmpeg -i audiotrack.ape audiotrack.mp3
при желании битрейт можно установить по вкусу при помощи опции -ab:
ffmpeg -i audiotrack.ape -ab 192k audiotrack.mp3

2. Режем mp3 на отдельные песни при помощи Mp3splt:
mp3splt -c audiotrack.cue audiotrack.mp3
Что приятно mp3splt не только автоматически порежет mp3 по временным отметкам из cue, но поименует отдельные песни и пропишет информацию в ID3.

среда, 4 июля 2012 г.

Нюансы извлечения mp3 из видео при помощи ffmpeg

или Вот что map животворящий делает!

С некоторой сборки FFmpeg (не отследил с какой именно) заметил, что стандартная команда извлечения mp3 из видео:

ffmpeg -i video.mp4 audio.mp3

стала выполняться просто адски долго. Например, часовое видео с аудиодорожкой в формате aac конвертировалось в 64К mp3 37 минут:

ffmpeg -i video.mp4 -acodec libmp3lame -ab 64K audio.mp3

Ларчик тем временем открывался просто - теперь нужно всего лишь явно указать не трогать видео дорожку (в моём случае - нулевую), а использовать только аудио (в моём случае - первую):

ffmpeg -i video.mp4 -map 0:1 -acodec libmp3lame -ab 64K audio.mp3

и, о чудо, время конвертации часового видео вернулось к старым добрым 2-м минутам.


пятница, 16 сентября 2011 г.

И еще про FFmpeg и многопроцессорность

В продолжение предыдущей заметки - решил попробовать новую версию FFmpeg (от 15.09.2011) на машине с Intel® Core™ i7-930 (4 ядра, каждое с Hyper-Threading, итого 8 логических процессоров), ну думаю, щас полетит :), старая-то версия FFmpeg загружала этот процессор не более чем на 12%.
Полетел, но не шибко высоко, загрузка где-то на 40%, т.е. то что 4 ядра новый FFmpeg уже видит, а то что за счет Hyper-Threading можно еще в 2 раза число потоков увеличить - пока нет :(
Но эффект от 4 ядер все-таки есть - все тот же файл конвертировался на Intel® Core™ i7-930 всего 28 мин.

четверг, 15 сентября 2011 г.

Новости FFmpeg

Попробовал новую (от 15.09.2011) сборку FFmpeg at Zeranoe.com - вот эту http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-git-d55b06b-win64-static.7z и обнаружил, что она, в отличии от предыдущей, загружает двухядерный процессор моего компа не на 50%, а на все 100.
В результате та же команда (описанная в посте Как изменить разрешение видео и сохранить все аудио дорожки и субтитры), на том же файле выполняется не 80 мин, а 58. Разница есть однако, даешь поддержку многопроцессорности в массы!

UPD: продолжение.

понедельник, 5 сентября 2011 г.

Как изменить разрешение видео и сохранить все аудио дорожки и субтитры

Последнее время видеофильмы стали ходить с гигантскими разрешениями типа 1280x526, для обычного телевизора или мобильного устройства это во-первых, избыточно, а во-вторых, файл с таким фильмом имеет размер обычно больше 4ГБ и просто не может быть записан на флешку с FAT.
Если поинтересоваться у гугла "Как изменить разрешение видео", то наиболее распространенный рецепт будет такой - возьмите FFMPEG и сделайте как-то так:
ffmpeg -i inputvideo.mkv -s 720x296 outputvideo.mkv
Проблема в том, что ffmpeg по-умолчанию берет из inputvideo.mkv по одной дорожке видео, аудио и субтитров (если они есть), преобразует разрешение видео как указано (720x296) и помещает в outputvideo.mkv. Если дополнительные аудио дорожки и субтитры терять нежелательно, надо прописывать команды про каждую дорожку из исходного видео файла. При этом универсальной команды для всех видео файлов составить нельзя, сначала надо точно узнать сколько в исходном видео файле дорожек (streams) и в каком они порядке.

Команда
ffprobe inputvideo.mkv
выдает информацию о видео файле (ffprobe - программка из комплекта ffmpeg), в конце будет такой блок:
    Stream #0.0(eng): Video: h264 (High), yuv420p, 1280x526, SAR 1:1 DAR 640:263, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Metadata:
      title           : Shogun Assassin (1980)
    Stream #0.1(rus): Audio: ac3, 48000 Hz, mono, s16, 128 kb/s (default)
    Metadata:
      title           : Puchkov aka Goblin
    Stream #0.2(rus): Audio: ac3, 48000 Hz, mono, s16, 128 kb/s
    Metadata:
      title           : Kuznetsov
    Stream #0.3(rus): Audio: ac3, 48000 Hz, mono, s16, 128 kb/s
    Metadata:
      title           : Tolbin
    Stream #0.4(rus): Audio: ac3, 48000 Hz, mono, s16, 128 kb/s
    Stream #0.5(eng): Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
    Stream #0.6(eng): Audio: vorbis, 48000 Hz, stereo, s16
    Metadata:
      title           : Commentary1 Vorbis 2.0 80 kbps
    Stream #0.7(eng): Audio: vorbis, 48000 Hz, stereo, s16
    Metadata:
      title           : Commentary2 Vorbis 2.0 80 kbps
    Stream #0.8(rus): Subtitle: text
Unsupported codec with id 94210 for input stream 8
Видно, что в файле 1 дорожка видео, 7 дорожек аудио и 1 дорожка субтитров. На "Unsupported codec with id 94210 for input stream 8" можно не обращать внимания, т.к. дорожку с субтитрами мы будем просто копировать, кодек для этого не нужен. Итак -
ffmpeg -i inputvideo.mkv -s 720x296 
начало тоже самое - входной файл и нужное разрешение, дальше -
-acodec copy -scodec copy
указываем, что аудио и субтитры нужно копировать как есть, без перекодирования.
А теперь основное, на первом месте всегда видео дорожка (первый 0 - индекс входного файла, второй 0 - индекс дорожки в этом файле) -
-map 0:0
потом аудио дорожки и субтитры -
-map 0:2 -map 0:1 -map 0:3 -map 0:4 -map 0:5 -map 0:6 -map 0:7 -map 0:8
при этом заодно переставим местами две аудио дорожки, #2 из входного файла станет #1 в выходном. Ну и собственно выходной файл -
outputvideo.mkv
Итого вся команда:
ffmpeg -i inputvideo.mkv -s 720x296 -acodec copy -scodec copy -map 0:0 -map 0:2 -map 0:1 -map 0:3 -map 0:4 -map 0:5 -map 0:6 -map 0:7 -map 0:8 outputvideo.mkv
Перекодирование заняло 1ч 20мин, размер файла из 4762МБ стал 855МБ.

среда, 27 января 2010 г.

Цветочная история Rsdn@Home

Продолжаем игры с визуализацией :)



Это уже работа Gource. Процесс следующий:
  1. Получить из репозитория (в данном случае - http://svn.rsdn.ru/svn/Janus) лог разработки: svn log --verbose --xml > janus.log
  2. Скачать Gource
  3. Скачать к нему скрипт svn-gource.py для конвертирования логов SVN
  4. Установить python 2.6
  5. Скачать FFmpeg
  6. Найти mencoder - он есть в комплекте MPlayer
  7. Сконвертировать лог SVN в формат Gource: python svn-gource.py --filter-dirs janus.log > janus-gource.log
  8. Создать файл janus.out с последовательностью скриншотов в PPM формате: gource --log-format custom --bloom-intensity 0.1 -768x480 --hide-dirnames --background 000000 --stop-at-end --seconds-per-day 0.01 --highlight-all-users --hide-filenames --date-format %%d-%%m-%%Y --output-ppm-stream janus.out janus_gource.log
  9. Преобразовать janus.out в сжатое видео, например flv: ffmpeg -y -b 3000K -r 60 -f image2pipe -vcodec ppm -i janus.out -vcodec flv -vpre default janus.flv
  10. Наложить аудио: mencoder janus.flv -o janus_a.flv -ovc copy -oac copy -audiofile audio.mp3
  11. Повторять 33 раза до получения приемлемого результата :)