LINUX.ORG.RU
ФорумJob

Ищу программиста С для доработки ffmpeg

 , ,


3

2

Задача состоит в следующем нужно доработать ffmpeg чтобы он не падал при обрыве интернета при передаче push. В общем если мы на вывод ffmpeg указываем публиковать поток на удаленный сервер такой командой -f mpegts http://IP:PORT/test/mpegts то он у нас публикуется и нормально этот поток отдает, а сервер соответственно его принимает. Если случается обрыв интернета кратковременный или какие то проблемы с сетью то ffmpeg падает с ошибкой «av_interleaved_write_frame(): Broken pipe» и больше не пытается переподключиться и отдать push. Это нужно исправить и сделать чтобы он при обрыве интернета не падал, а продолжал кодировать и до победы пытался подключиться к серверу чтобы отдать ему push. Доработка должна быть оформлена в виде патча к исходникам ffmpeg. Оплата по договоренности.

Skype: svgramatchikov

Mail: svgramatchikov@gmail.com



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

Да думали над этим. Но все таки хотелось бы сам баг в библиотеке исправить, Тем более я так понимаю он у них древний, просто на него никто внимания не обращал.

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

Библиотека не должна пытаться восстанавливаться из-за внешних ошибок. А если пользователю либы не нужен этот реконнект, а нужно своевременно упасть? Либа должна просто передать ошибку вверх и все (что она по ходу и делает).

Лучше сделай через Unix way - пусть ffmpeg кодирует поток в локальный пайп (или типа того), а оттуда его уже достает утилита и сует на сервер. При этом утилиту ты пишешь как хочешь с любым поведением (а может и что готовое найдешь).

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

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

svgram
() автор топика

У меня этот баг решается автоматическим перезапуском.

А патч этот в апстрим планируешь отправлять?

entefeed ☆☆☆
()
Ответ на: комментарий от svgram

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

что-что?

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

То что мне сказали в чем причина, то я и написал. Я так понимаю вы в ffmpeg разбираетесь, скажите в чем причина и можно ли это устранить или нет ? Или только скрипт перезапуска поможет ?

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

Так Pavval написал самую удобную реализацию. Так если ffmpeg обновить понадобиться или на другой машине поднять. Зачем это все? Правильно сказано — писать свою маленькую цацу которая умеет реконнект. тредов-еполов там никаких не надо, один вход, один выход, тупо утилитка-«буфер».

deep-purple ★★★★★
()
Ответ на: комментарий от Harald

Классно получается у ffmpeg это не баг, а утилитка-«буфер» надо понимать это не костыль. Чем демагогией заниматься лучше расскажите по секрету в чем проблема заключается чтобы в коде это подправить ?

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

В том что ффмпег ты будешь расколупывать и долго смотреть что от чего зависит и кто кого дергает. А утилитку сел и написал.

deep-purple ★★★★★
()
Ответ на: комментарий от svgram

а утилитка-«буфер» надо понимать это не костыль

Костыль - это перелопачивать либу общего назначения, чтобы она делала то, что нужно тебе (и явно не нужно куче других людей).

Утилитка - это не костыль, а как раз реализация твоего частного поведения в рамках твоего личного кода. А не подпорка чужого.

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

Вы невнятно и недетально изъясняетесь, и, видимо, сами не вполне понимаете, что происходит, и что именно вам нужно. Поэтому я вам ничем конкретным помочь точно не смогу.

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

av_interleaved_write_frame(): Broken pipe

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

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

Я детально в шапке темы объяснил что мне именно нужно. Чегото не внятно и непонятного я там не заметил.

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

Вспомнилось:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался! Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется. Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами! Старожил: Какое дерево? Ты вообще соображаешь, что говоришь? Новичок: Чем мне нравиться этот форум - из двух ответов ниодного конкретного. Одни вопросы неподелу! Старожил: Не нравится - тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить. Новичок: Не знаите - лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ!!! Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю!!! А от вас нормального ответа недождёшся!!! Прохожий: Самое крепкое дерево - дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность. Новичок: Спасибо, братан! То что нужно!!!

deep-purple ★★★★★
()
Ответ на: комментарий от Pavval

С вашим мышлением тоже все понятно по поводу того «чтобы она делала то, что нужно тебе (и явно не нужно куче других людей)». Когда народ qsv прикручивал к ffmpeg тоже нужно было единицам, а сейчас его даже в офф сборке добавили. А утилитки писать для «частного случая», это как раз таки и есть тот случай когда знаний не хватает в коде разобраться, а хватает на то чтобы утилитку написать. Имхо.

svgram
() автор топика
Ответ на: комментарий от deep-purple

Тонкий у вас однако юмор с намеком. Понимаю что скучно перед сном. Но если знаний не хватает в коде разобраться и сделать то что просят то на фига флуд разводить. Язык чешется или пальцы зудят, утилитку лучше какую нибудь напишите которая спамить за вас будет )))

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

Не, знаний то может и хватит. А вот времени нету нифига. И я все так же даю +1 для отдельной утилитки.

Ну а спамилка у меня есь, но не для здесь ))

deep-purple ★★★★★
()
Ответ на: комментарий от Harald

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

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

А утилитки писать для «частного случая», это как раз таки и есть тот случай когда знаний не хватает в коде разобраться, а хватает на то чтобы утилитку написать.

У меня вполне себе хватает знаний изменить ffmpeg. Но я вижу, что это х**та и так делать не нужно. Даже если готовый код есть, то его нужно выкинуть и сделать через «утилиту». Потому что либа - это обобщенная реализация. Одному надо, чтобы валилось при ошибке, а второму - чтобы реконнектилось до упора. Третьему - с упором в определенный таймаут. Четвертому - чтобы при фейле коннектилось к бекап-серверу. Пятому - чтобы начинало сохранять на локальный диск и коннектилось на фоне, а потом сначала сливало с диска, а потом продолжало живое. Шестому нужно терять данные, пока коннекта нет, т.к. у него ни диска ни оперативы под все нету. И таких идиотов, желающих обязательно перекостылять ffmpeg - прорва.

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

Потому что либа - это обобщенная реализация.

Тут влезаю я и сообщаю, что сообщение «av_interleaved_write_frame(): Broken pipe» выдаёт не библиотека FFmpeg, а программа ffmpeg. Та, что собирается из файла ffmpeg.c.

i-rinat ★★★★★
()
Ответ на: комментарий от Pavval

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

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

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

svgram
() автор топика

у вас всегда есть другой вариант: поставить второй флюссоник, который будет пушить.

max_lapshin ★★★★★
()

По идее настроить буферизацию [+ проксирование] должно помочь.

swwwfactory ★★
()
Ответ на: комментарий от i-rinat

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

Iron_Bug ★★★★★
()
13 октября 2016 г.
Ответ на: комментарий от vladimir-vg

А разве это не скрипт в одну строку? Помер — перезапустил.

такой?

#!/bin/bash
while true
do
ffmpeg -i rtsp://admin:123456@192.168.1.123:554/mpeg4 -vcodec copy -an -f rtsp rtsp://my.flussonic.ip:554/published
done

на флюссонике тоже такой скрипт используется?

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

А вам не проще ffmpeg под какой-нибудь runit завести?

Я завел ffmpeg, который падает каждые 2-3 секунды в бесконечный цикл. Это нормальное решение?

При еденичном запуске ffmpeg выдает такую же ошибку как у ТС

...
av_interleaved_write_frame(): Broken pipe00:00:14.06 bitrate=N/A
frame=  292 fps= 23 q=-1.0 Lsize=N/A time=00:00:14.58 bitrate=N/A
video:4495kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!

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

если у вас там именно mpeg4, который mpeg4 part2, то нет: flussonic его не принимает, потому что это уже слишком старый кодек и мы его не поддерживаем.

Надо транскодить в h264.

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

Так у меня ffmpeg падает с ошибкой av_interleaved_write_frame() потому что флюссоник не поддерживает mpeg4 part2 (если у меня в камере mpeg4 part2)?

Как с помощью ffmpeg посмотреть какой у меня в камере формат, mpeg4 part2 или нет?

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

Как правильно посмотреть SDP с помощью ffmpeg?

Насколько я знаю, по RTSP протоколу нужно послать команду DESCRIBE, но я не знаю как это сделать...

Если просто дать команду

ffmpeg -i rtsp://admin:123456@192.168.1.123:554/mpeg4
то мне выдаст:
ffmpeg version 2.8.8-0ubuntu0.16.04.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, rtsp, from 'rtsp://admin:123456@192.168.1.123:554/mpeg4':
  Metadata:
    title           : RTSP/RTP stream from Network Video Server
    comment         : mpeg4
  Duration: N/A, start: 0.041000, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuv420p, 1280x720, 24.92 tbr, 90k tbn, 180k tbc
At least one output file must be specified
но тут данных маловато как для SDP...

pospelov
()

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

«av_interleaved_write_frame(): Broken pipe»

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

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

Что за патч? Где взять? Что именно патчить надо?

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

ffmpeg.c
для версии 3.1.4

--- ffmpeg.old  2016-10-19 02:03:16.900415087 +0500
+++ ffmpeg.c    2016-10-19 02:06:13.924201985 +0500
@@ -760,11 +760,13 @@
     }

     ret = av_interleaved_write_frame(s, pkt);
+               /*
     if (ret < 0) {
         print_error("av_interleaved_write_frame()", ret);
         main_return_code = 1;
         close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODE
R_FINISHED);
     }
+               */
     av_packet_unref(pkt);
 }
В этом случае, закоментировать закрытие потоков и всё.

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

Я пробовал закоментировать строку

close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODE R_FINISHED);
при этом ffmpeg действительно не закрывает соединения, постоянно сыпет ошибку av_interleaved_write_frame(): Broken pipe миллион раз, сам не выключается, но и видео на выходе нет :-)

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

Когда народ qsv прикручивал к ffmpeg

Добавить фичу != менять поведение

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

Так ты так закоментируй.

/*
     if (ret < 0) {
         print_error("av_interleaved_write_frame()", ret);
         main_return_code = 1;
         close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODE
R_FINISHED);
     }
*/

Тогда не будет даже проверки на ошибку, не говоря уже о сообщении.

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

Как правильно посмотреть SDP с помощью ffmpeg?

нашел, если все правильно, по просто на выходе из ффмпега надо поставить -f rtp rtp://ip.address:port

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