Кто поможет вствить код в SVN

Dennis
2009-05-17
2013-08-23
  • Dennis

    Dennis - 2009-05-17

    Всем привет !

    Есть одна идея, хотелось бы увидеть ее в стабильных версиях. Собственно вопрос касается
    транскодинга, точнее механизма позиционирования при использовании транскодинга.
    Все, наверное, попадали в ситуацию, когда по каким то прчинам видео вырубается
    на середине просмотра, учитывая текущий механизм реализации транскодинга перемотать
    до нужного момента возможности нет. Поэтому пришла такая идея, с помощью скрипта
    импорта организовать примерно такую структуру:
    Video
             1.avi
                     00:00:00
                     00:10:00
                     ..................
                     01:10:00
    При этом в в скрипте транкодинга использовать, например, для ffpeg параметр '-ss'.
    Таким образом можно позиционировать начало просмотра. При реализации столкнулся
    с проблемой. Кроме параметров %in и %out, в скрипт ничего не передается, а хотелось бы,
    в данном случае, поиметь obj.title. Удалось решить проблему только правкой исходника,
    transcode_ext_handler.cc из текущего SVN:
       chmod(fifo_name.c_str(), S_IWUSR | S_IRUSR);

        arglist = parseCommandLine(profile->getArguments(), location, fifo_name);

    //!!!!!!!!!!!!!!!!!!!!!!!! Это добавил
    setenv("OBJECT_TITLE",obj->getTitle().c_str(),1);
    log_info("Title: %s\n", obj->getTitle().c_str());
    //!!!!!!!!!!!!!!!!!!!!!!!!

        log_info("Arguments: %s\n", profile->getArguments().c_str());
        Ref<TranscodingProcessExecutor> main_proc(new TranscodingProcessExecutor(profile->getCommand(), arglist));

    Теперь в окужении скрипта есть переменная OBJECT_TITLE с зголовком, дальше дело техники
    как в скрипте ее обработать, если кому интересно, могу скрипт прислать, но вопрос сейчас
    не в нем, а в том, как включить выше приведенный фрагмент (либо анлогичный) в SVN ?

     
    • Jin

      Jin - 2009-05-19

      А чем именно помогает эта переменная? Т.е. я не совсем понимаю идею, имя файла есть, когда имеем дело с видео объектами, то title тоже являться именем файла (только без полного пути).

      Смущаает еще один момент, тут надо будет попробовать... setenv() установит переменную глобально для всех запущенных в этот момент скриптов, или только для новосозданного процесса? Ведь надо учесть, что сервер одновременно может транскодировать несколько потоков (например если два человека смотрят с разных плееров одновременно).

      А так в принципе добавить могу, но надо бы лучше проиграть весь сценарий...

      Jin

       
    • Jin

      Jin - 2009-05-19

      Прочитал еще пару раз, по моему стало доходить: импорт будет создавать имена фильма, разбивая его на 10 минут? Если честно, идея не очень нравится...

      А в целом, сори конечно, что мы так в последнее время затормозили прогресс, просто я купил себе старый УАЗик, и теперь все свободное время в нем ковыряюсь :) Отремонтирую, тогда надеюсь дальше дело пойдет с MT...

       
    • Dennis

      Dennis - 2009-05-21

      Именно так, разбивка по времени, на 10 минут, в данном примере. Вообще идея не моя, одно время я пользовался
      HMS (homemediaserver.ru), в нем реализована такая фишка. На мой вгляд, очень достойный медиа сервер, жаль
      что только в форточках работает. Нравится-не нравится, это вопрос субъективный, в любом случае, от этих 3-х
      строк кода функционал никак не пострадает :) Может кому-то такой подход и понравится. А у меня вопрос,
      есть еще какие-то способы организовать позиционирование в транскодированном потоке ?

      Удачи с уазиком ! :)

       
    • Dennis

      Dennis - 2009-05-21

      Да вот еще что, setenv, разумеется, выставляет переменную в окружении текущего процесса, она наследуется
      потомками, которые после exec-a, имеют собственную копию окружения, так что на уже запущенные процессы
      транскодирования, разумеется, это никак не повлияет.
      Вот функция импотра видео, для теста, там разбивка совершенно примитивная, макс. до 3-х часов, без учета
      реальной длительности (поленился :)
      function addVideo(obj)
      {
          var chain = new Array('Video', 'All Video',obj.title);
          var title=obj.title;
          for(var h=0;h<3;h++) {
              for(var m=0;m<60;m+=5) {
                  var mm = ''+m;
                  if(mm.length == 1) {mm='0'+mm};
                  obj.title = '0'+h+':'+mm+':00';
                  addCdsObject(obj, createContainerChain(chain));
              }
          }
          obj.title=title;

          var last_path = getLastPath(obj.location);
          if (last_path)
          {
              chain = new Array('Video', 'Directories', last_path);
              addCdsObject(obj, createContainerChain(chain));
          }
      }

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

      local seek='00:00:00'
      echo "$OBJECT_TITLE" | grep '^[0-9]*:[0-9]*:[0-9]*' >/dev/null 2>&1
      if [ "$?" == "0" ]
      then
              seek=`echo "$OBJECT_TITLE" | sed -e 's/^\([0-9]*:[0-9]*:[0-9]*\).*/\1/'`
      fi

      exec ffmpeg -ss "$seek" -i "$input" -vb $VB -vcodec mpeg2video -sameq -acodec copy -f vob -y "$output"

       
  • Jurik_Phys

    Jurik_Phys - 2013-08-20

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

    Не получается разобраться, как получить реальную длительность файла.

    В исходниках есть:

    String duration = item->getResource(0)->getAttribute(MetadataHandler::getResAttrName(R_DURATION));
    if (string_ok(duration))
    t_res->addAttribute(MetadataHandler::getResAttrName(R_DURATION),
    duration);

    но, как из этого получить результат в import.js - не ясно.

    Может уже есть решение, с учётом древности вопроса?

     
  • Jurik_Phys

    Jurik_Phys - 2013-08-23

    Разобрался с вопросом. Прикладываю patch на случай, если кто-то заинтересуется. Патч к исходникам mediatomb из debian wheezy. С сайта сейчас не собирается, версия. Краткое описание, как использовать в описании патча.

     

Log in to post a comment.