Ответы пользователя по тегу FFmpeg
  • Как собрать ffmpeg с поддержкой decklink?

    @monah_tuk
    Конфиг ничегошеньки не знает про физическое железо. Он ищет файлы SDK, помогите ему найти их. Смотрите куда поставлен SDK и на опции `--extra-libs`, `--extra-ldflags`, `--extra-cflags`, что бы подсказать где искать файлы SDK.
    Ответ написан
    2 комментария
  • Как добавить аудио дорожку к прямому эфиру средствами FFmpeg?

    @monah_tuk
    Да там нет разницы, потоки или файлы.

    Вот рабочий пример для вашего потока и первого найденного в гугле радио:
    ffmpeg -i http://video.iluki.ru:81/matrosov_museum_102/index.m3u8 -i http://icecast.radiodfm.cdnvideo.ru/dfm.mp3 out.mkv


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

    Интереснее если файл записан. Тут нужно сказать ему, что бы он крутился по кругу. Тут поможет это: video.stackexchange.com/questions/12905/repeat-loo..., а команда получится такой:
    ffmpeg -i http://video.iluki.ru:81/matrosov_museum_102/index.m3u8 -f lavfi -re -i "amovie=filename=/tmp/some.mp3:loop=0, asetpts=N/SAMPLE_RATE/TB" -fflags +genpts -y out.mkv


    вместо конкретного файла тут может быть и плей-лист. Всё остальное как и для примера с live-потоком аудио.

    Если разберётесь с опцией -map, то можно брать аудио-дорожки из других видео.
    Ответ написан
    Комментировать
  • Как настроить mosaic в VLC под Mac Os?

    @monah_tuk
    При помощи FFmpeg (ffplay) это делается как-то так:
    ffplay -f lavfi 'color=black:360x240[main]; movie=/home/hatred/lightning-timezones.mkv, scale=180:-1[0]; movie=/home/hatred/lightning-timezones.mkv, scale=180:-1[1]; [main][0]overlay=0:0[main-0], [main-0][1]overlay=180:0'


    за подробностями - в документацию на ffmpeg.org.
    Ответ написан
    Комментировать
  • Как получить скриншот через FFmpeg?

    @monah_tuk
    Лехко!
    ffmpeg -re -i 07-Doxygen.mkv -c:v copy -c:a copy -f matroska TMP.mkv -f image2 -r 1/30 -updatefirst 1 -y TMP.jpeg


    Это рабочий тестовый вариант с генерацией скрина (TMP.jpeg) каждые 30 сек. Для 5 минут - 1/300.

    Для rtmp publish будет как-то так:
    ffmpeg -re -i 07-Doxygen.mkv -c:v copy -c:a copy -f flv rtmp://some_site.com/app/stream -f image2 -r 1/30 -updatefirst 1 -y TMP.jpeg


    И снова повторюсь: читайте доки, они рулез:
    1) https://ffmpeg.org/ffmpeg-formats.html#image2-2
    2) https://ffmpeg.org/ffmpeg.html#Synopsis

    ЗЫ про updatefirst вместо update, это косяк в доках :) но сам ffmpeg при запуске подсказку даёт.
    Ответ написан
    Комментировать
  • Почему ffmpeg всегда скидывает в лог параметры коммандной строки?

    @monah_tuk
    Только писать BugReport:
    idx = locate_option(argc, argv, options, "report");
        if ((env = getenv("FFREPORT")) || idx) {
            init_report(env);
            // Код ниже сбрасывает параметры командной строки невзирая ни на что. Главное что бы файл смог открыться
            if (report_file) {
                int i;
                fprintf(report_file, "Command line:\n");
                for (i = 0; i < argc; i++) {
                    dump_argument(argv[i]);
                    fputc(i < argc - 1 ? ' ' : '\n', report_file);
                }
                fflush(report_file);
            }
        }


    Исправление тоже достаточно простое:
    if (report_file && report_file_level)

    так что можете сами пересобрать.

    С другой стороны, если вы не собираетесь логировать вообще, то зачем передавать файл для репорта?

    Это ответ на вопросы: "почему?" и "как?"

    Ответ на вопрос: "зачем?" - репорт изначально задумывался как фича, полезная в разруливании некоторых багов. Их просят прикладывать к отчётам, что бы при этом не засирался выхлоп на экран. Так что это фича была больше для разработчиков. То, что пользователи используют инструмент не так, как задумывалось... Ну за всех думу не передумаешь :)
    Ответ написан
  • Как через ffmpeg объединить каждый mp4 файл из папки с одним файлом вне папки?

    @monah_tuk
    Одну команду - нет. Цикл на Shell (sh, bash) будет выглядеть как-то так:
    ad=/path/endfile.mp4
    clips_in=/path/
    clips_out=/tmp/
    for clip in $clips_in/*.mp4; do
      nm=`basename $clip .mp4`
      cat | ffmpeg -f concat -i - -c:v copy -c:a copy $clips_out/${nm}_out.mp4 << EOF
    file $clip
    file $ad
    EOF
    done

    Concat делать способом, который вам больше нравится:
    • ffmpeg.org/ffmpeg-filters.html#concat - требует перекодирования, но результат обычно более гибкий и точный. Скорее всего придётся корректировать pts при помощи опции -fflags +genpts на выходе или фильтра pts.
    • ffmpeg.org/ffmpeg-formats.html#concat-1 - тут всё понятно, pts фиксится автоматом.


    Этот способ склейки вам не подойдёт: ffmpeg.org/ffmpeg-protocols.html#concat
    Ответ написан
  • Поиск файлов в каталоге и воспроизведение. Как реализовать?

    @monah_tuk
    Не понятна задача с поиском, а так, inotify + ffmpeg. И объединить всё это в скипт. За подробности - в документацию inotify.
    Ответ написан
  • Как правильно написать скрипт перезапуска ffmpeg при обрыве интернета?

    @monah_tuk
    Для начала попробуйте использовать не встроенный RTMP модуль в FFmpeg, а собрать с использованием librtmp (--enable-librtmp). Они функционально и по багам сильно отличаются. Если Ubuntu Server основан на 14.04 LTS, можно взять из моего PPA: https://launchpad.net/~adrozdoff/+archive/ubuntu/f...

    Если не поможет, то нужно будет доставить пакет ffmpeg-opti-dbg, после чего:
    1. выполнить команду ulimit -c unlimited
    2. запустить ffmpeg
    3. дождаться зависания
    4. из соседней консоли выполнить команду killall -ABRT ffmpeg
    в каталоге сгенерируется coredump файл, который можно где-то выложить и посмотреть, что там происходило и почему висим.

    Вообще есть такая беда у FFmpeg при работе с сетью. Как минимум чинил утечку дескрипторов в родной реализации rtmp. Тут может быть что-то похожее. Кроме того, стоит поискать на их баг-трекере похожие вопросы, возможно уже есть решение.
    Ответ написан
    Комментировать
  • Можно ли записывать буфер ffmpeg в отдельный файл?

    @monah_tuk
    Чистого решения я не знаю (скорее всего его и нет), но что-то близкое можно сообразить при помощи: ffmpeg.org/ffmpeg-formats.html#segment_002c-stream...

    Например:
    ffmpeg -i in.mp4 -f segment -segment_format mpegts -segment_time 30 -segment_wrap 2 -segment_list out.m3u8 out%d.t


    плохо то, что можно segment_wrap поставить в 1, тогда будет 1 файл, но он каждый раз будет полностью перезаписываться, т.е. не будет скользящего окна.

    Можно сделать сегменты очень короткими, но сделать их много, тогда будет какое-то впечатление скользящего окна при проигрывании m3u8 файла.
    Ответ написан
  • Как добиться CBR h264 транскодинга в ffmpeg?

    @monah_tuk
    Если входной поток CBR и h264, то без перекодировки:
    ffmpeg -i rtmp://host/app/stream -c:v copy [опционально, для audio: -c:a copy] -f mpegts udp://@232.0.0.2:1222?pkt_size=1316


    Если входной поток не CBR, то без перекодирвоки низя. Тут как-то так:
    ffmpeg -re -i [входящий rtmp] -vcodec h264 -s 1920x1080 -r 25 -b:v 5M -minrate:v 5M -maxrate:v 5M -bufsize:v 16.8M -acodec aac -ac 2 -b:a 192k -f mpegts udp://@232.0.0.2:1222?pkt_size=1316


    учти, что b:v влияет на видео, а общий битрейт потока будете b:v+b:a+оверхед на контейнер. С опциями H264 нужно будет эксперементировать для получения нужного результата. Вот ссылок
    * htrd.su/wiki/zhurnal/2014/09/24/x264_low_latency
    * web.archive.org/web/20150203203142/http://mewiki.p... (www.chaneru.com/Roku/HLS/X264_Settings.htm)
    * trac.ffmpeg.org/wiki/Encode/H.264
    Ответ написан
    Комментировать
  • Как узнать что входит в сборку FFmpeg?

    @monah_tuk
    ffmpeg -formats
    ffmpeg -codecs
    а строка билда просто выводится при запуске ffmpeg.
    Ну и попробуйте вот этот PPA, уже собрано: https://launchpad.net/~adrozdoff/+archive/ubuntu/f...
    Ответ написан
    Комментировать
  • Как скомпилировать бинарник ffmpeg?

    @monah_tuk
    env PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
    ../configure \
                 --extra-ldflags="-static-libstdc++ -static-libgcc" \
                 --enable-static \
                 --disable-shared \
                 --enable-nonfree \
                 --enable-libfaac \
                 --enable-libfdk-aac \
                 --enable-cross-compile \
                 --pkg-config=pkg-config \
                 --arch=x86_64 \
                 --target-os=mingw32 \
                 --cross-prefix=x86_64-w64-mingw32-


    а дальше всё зависит от уже собранных библиотек. Вообще, читайте про кросс-компиляцию и т.п.
    Ответ написан
    Комментировать
  • Не могу скомпилировать проект C++ FFMPEG?

    @monah_tuk
    Никогда не собирал FFmpeg под Windows из-под Windows, но попробуй убрать --target-os=XXX вообще - собираешь native, так что он сам должен разобраться.
    Ответ написан
    Комментировать
  • Ffmpeg avi to mp4 h 264?

    @monah_tuk
    Товарищ Nc_Soft дал вполне работоспособные команды, да собственно и ваша изначальная тоже.

    UPD: по замечанию Nc_Soft исправлено про треды (прочитал 0 как 1, бывает).
    Отмечу, что -threads 0 стоит продублировать перед -i и после: положение опции играет роль: до -i - параметры для входа (как будет параллелиться декодировщик), после -i - параметры для выхода (как будет параллелиться кодировщик). Значение параметра - число тредов. 0 - будет выбрано оптимальное число (обычно по числу ядер с учётом гипертрединга), указывать больше чем есть - начнёте платить за переключения контекстов сильно много.

    С параметрами кодека лучше изучить: ffmpeg.org/ffmpeg-codecs.html#libx264_002c-libx264rgb и поиграться с нужными параметрами. Качество, как и цвет и вкус, параметр очень субъективный.

    Ещё вариант ускорения (если процессор простаивает и упираешься в IO): как минимум результат писать на tmpfs, после чего помещать куда нужно. Ну или переместиться полностью на SSD.

    ЗЫ интересно, кто меня в эксперты подписал?
    Ответ написан
    3 комментария
  • Как определить "качество видео" через ffmpeg?

    @monah_tuk
    ffmpeg -i lightning-timezones.mkv
    Guessed Channel Layout for  Input Stream #0.1 : stereo
    Input #0, matroska,webm, from 'lightning-timezones.mkv':
      Metadata:
        ENCODER         : Lavf56.15.102
      Duration: 00:02:21.61, start: 0.067000, bitrate: 442 kb/s
        Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
        Metadata:
          ENCODER         : Lavc56.13.100 libx264
        Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s (default)


    конкретно:
    Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, **1920x1080**, SAR 1:1 DAR 16:9, **29.97** fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)


    Выделенное **ITEM**, первое разрешение, второе - FPS, DAR - Display Aspect Ratio - соотношение сторон картинки (подробнее про SAR, DAR, PAR: https://en.wikipedia.org/wiki/Pixel_aspect_ratio).

    144p это не качество, а кодировка разрешения: 176×144 прогрессивная развёртка. Я могу вам сделать 1080p такого отвратительного вида, что вас тошнить будет от одного воспоминания. Обычно такой вид используется для представления разрешения по низкой стороне, а p или i после - прогрессивная или межстрочная развёртка (прогрессивная - полный кадр, FPS 1:1, межстрочная - в каждом кадре два (в теоретически и больше) полукадра, которые потом хитрыми алгоритмами восстанавливаются до полного кадра, чем увеличивают FPS на выходе в 2 раза). Одно такое кодирование может скрывать несколько разрешений, к примеру: 1080p это и 1920x1080 и 1440x1080, в обоих случаях DAR 16:9, а вот SAR в первом случае 1:1, а во втором 1.33:1. Или 720p, помимо популярного 1280x720 (DAR 16:9, SAR 1:1), это может быть 960x720 при DAR 4:3 и SAR 1:1 или, так же 960x720 при DAR 16:9 и SAR 1.33:1

    Забыл написать про ffprobe - используйте его. Если есть ffmpeg, есть и он:
    ffprobe -v 0 -select_streams v -print_format flat -show_format -show_streams /home/alexd/thunderbird-timezones-fix.mkv

    в качестве параметров "-print_format" можете указывать: flat, json, xml, csv, compact, ini - что вам покажется удобнее. "-select_streams" позволяет выбрать стримы по любому критерию, поддерживаемому ffmpeg: v - video, a - audio, # - по номеру и т.д. Пример выхлопа:
    streams.stream.0.index=0
    streams.stream.0.codec_name="h264"
    streams.stream.0.codec_long_name="H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"
    streams.stream.0.profile="High 4:4:4 Predictive"
    streams.stream.0.codec_type="video"
    streams.stream.0.codec_time_base="1001/60000"
    streams.stream.0.codec_tag_string="[0][0][0][0]"
    streams.stream.0.codec_tag="0x0000"
    streams.stream.0.width=640
    streams.stream.0.height=480
    streams.stream.0.coded_width=640
    streams.stream.0.coded_height=480
    streams.stream.0.has_b_frames=2
    streams.stream.0.sample_aspect_ratio="1:1"
    streams.stream.0.display_aspect_ratio="4:3"
    streams.stream.0.pix_fmt="yuv444p"
    streams.stream.0.level=30
    streams.stream.0.color_range="N/A"
    streams.stream.0.color_space="unknown"
    streams.stream.0.color_transfer="unknown"
    streams.stream.0.color_primaries="unknown"
    streams.stream.0.chroma_location="left"
    streams.stream.0.timecode="N/A"
    streams.stream.0.refs=4
    streams.stream.0.is_avc="1"
    streams.stream.0.nal_length_size="4"
    streams.stream.0.id="N/A"
    streams.stream.0.r_frame_rate="30000/1001"
    streams.stream.0.avg_frame_rate="30000/1001"
    streams.stream.0.time_base="1/1000"
    streams.stream.0.start_pts=67
    streams.stream.0.start_time="0.067000"
    streams.stream.0.duration_ts="N/A"
    streams.stream.0.duration="N/A"
    streams.stream.0.bit_rate="N/A"
    streams.stream.0.max_bit_rate="N/A"
    streams.stream.0.bits_per_raw_sample="8"
    streams.stream.0.nb_frames="N/A"
    streams.stream.0.nb_read_frames="N/A"
    streams.stream.0.nb_read_packets="N/A"
    streams.stream.0.disposition.default=1
    streams.stream.0.disposition.dub=0
    streams.stream.0.disposition.original=0
    streams.stream.0.disposition.comment=0
    streams.stream.0.disposition.lyrics=0
    streams.stream.0.disposition.karaoke=0
    streams.stream.0.disposition.forced=0
    streams.stream.0.disposition.hearing_impaired=0
    streams.stream.0.disposition.visual_impaired=0
    streams.stream.0.disposition.clean_effects=0
    streams.stream.0.disposition.attached_pic=0
    streams.stream.0.tags.ENCODER="Lavc56.13.100 libx264"
    format.filename="/home/alexd/thunderbird-timezones-fix.mkv"
    format.nb_streams=1
    format.nb_programs=0
    format.format_name="matroska,webm"
    format.format_long_name="Matroska / WebM"
    format.start_time="0.067000"
    format.duration="84.451000"
    format.size="80212"
    format.bit_rate="7598"
    format.probe_score=100
    format.tags.ENCODER="Lavf56.15.102"
    Ответ написан
    1 комментарий
  • Ресайз стрима через ffmpeg?

    @monah_tuk
    Moskus вам правильно намекнул на перекодировку.

    Вариантов борьбы немного: использовать железячное кодирование (например Intel QSV, который доступен с FFmpeg 2.7.1 или nVidia NVENC который появился раньше), что несколько понизит загрузку; смириться или использовать ферму для кодирования (кодировать стрим на других машинах и делать рестрим).

    Оптимально сделать микс из железячного кодирования и распределения нагрузки по ферме.
    Ответ написан
    1 комментарий
  • Как можно проверять статус ip-камер видеонаблюдения?

    @monah_tuk
    Настройке таймаут (-timeout): нет данных ffmpeg благополучно отвалится, вернув не нулевой код возврата (в Unix shell можно проверить через значение $?). Запустите его в скрипте, как отвалится - можно из консоли дернуть какой-то REST api при помощи того-же curl - поднять ошибку в базе /к примеру/ (хотя если вообще отвалился - что-то пошло не так). С серверной стороны можно настроить колбек на появление стрима (Wowza, nginx-rtmp это умеют) который эту ошибку заресетит.

    Аналогично можно попытаться полностью обойтись колбеками на принимающем сервере.

    Да, попробую быть телепатом, раз IP камера, значит поток от неё, скорее всего, RTSP или MJPEG (HTTP), следовательно смотреть документацию: ffmpeg.org/ffmpeg-protocols.html#rtsp и опцию -stimeout. Возможно придётся зафорсировать транспорт: -rtsp_transport tcp.
    Ответ написан
    3 комментария
  • Как синхронизировать стримы в FFmpeg?

    @monah_tuk
    Попробуйте lzone.de/cheat-sheet/ffmpeg со слов "Correcting Time-Shift" ну и вообще по этой теме погуглить.
    Ответ написан
    Комментировать
  • Как получить изображение с двух одинаковых веб камер с помощью ffmpeg в консоле?

    @monah_tuk
    -video_device_number XXX
    Читаем: ffmpeg.org/ffmpeg-devices.html#dshow
    Ответ написан
    Комментировать