Видео плейлисты с временем начала и окончания

10

Есть ли хорошее графическое приложение (например, графический интерфейс mplayer или что-то вроде банши) для linux, которое позволяет создавать и редактировать списки воспроизведения (для видеофайлов) с различным временем запуска и остановки для каждого видео в списке?

Добавлено :

На данный момент я делаю вручную файлы, которые содержат что-то вроде этого:

video.avi -ss 2440 -endpos 210
#some comment

video2.mp4 -ss 112 -endpos 2112

Тогда у меня есть скрипт-обертка для: mplayer -fs $(grep -v "^ #" $1)

Кроме того, я написал несколько функций emacs, которые немного упрощают редактирование таких файлов. (Как преобразование начального и конечного времени из формата чч: мм: сс в секунды и конечное время в относительное положение (конечное время - начальное время), как того требует -endpos (я могу публиковать макросы, если кому-то интересно). Однако это все еще слишком неудобно. Поэтому мой вопрос заключается в том, есть ли хороший графический интерфейс для этого (например, который позволяет пометить на временной шкале видео время начала и окончания для списка воспроизведения и т. Д.).

ученик
источник
@ user5289: Если вас интересуют только ответы для Ubuntu (вы не упомянули дистрибутив в своем вопросе), вы можете выбрать, на какой сайт обращаться. Если вы предпочитаете Ask Ubuntu, используйте flagкнопку вашего вопроса и попросите перенести ее.
Жиль "ТАК - перестать быть злым"
1
@ user5289 Это все, что вы хотите .., чтобы иметь возможность воспроизводить видео в графическом интерфейсе (потому что «mplayer», конечно, не GUI)? ... или вы хотите иметь возможность устанавливать временные позиции в графическом интерфейсе (также)? ... потому что вы можете просто использовать Smplayer, чтобы использовать свои существующие "синхронизированные команды" .. Я написал скрипт для этого ... Я опубликую сценарий как и отвечу ... кто-то может найти его интересным ... Я, конечно, нашел ваш метод интересным .. и я только что адаптировал его к Smplayer ..
Peter.O
@ fred.bear, да, дело в том, что я хочу иметь возможность устанавливать временные позиции в графическом интерфейсе, редактировать весь список воспроизведения в графическом интерфейсе некоторым удобным способом. (Игра в GUI не важна)
ученик
@ user5289: Вполне возможно установить временные позиции в графическом интерфейсе ... Я делаю это с помощью Smplayer .... Я добавил новый timestampsскрипт в свой первоначальный ответ, который показывал только play-it-in-Smplayerскрипт
Peter.O

Ответы:

3

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

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

varrtto
источник
2
Да, я знаю, как вырезать видео, используя Kino или что-то в этом роде. Вопрос действительно в плейлистах, а не в создании новых видео. Создание таких списков воспроизведения будет очень быстрым, гибким и не потребует дополнительного дискового пространства.
студент
3

ОБНОВЛЕНИЕ-2: После отправки следующего скрипта, меня осенило, что еще один способ установить временные позиции (в графическом интерфейсе) - это использовать редактор субтитров (например, gnome-subtitles). Вы можете просто щелкнуть, чтобы отметить начальную и конечную позиции «фантомных субтитров»; на самом деле вы можете поместить свой путь к файлу и комментарии в качестве «субтитров» ... Некоторые форматы не подходят (например, с использованием номеров кадров) .. «ViPlay Subtitle File», Power DivX и «Adobe Encore DVD» хороший.

ОБНОВЛЕНИЕ-1; новый скрипт ... Этот скрипт не даст вам встроенную возможность воспроизведения, но он позволит вам выбирать, сохранять и изменять время начала и окончания в Smplayer без необходимости что-либо вводить.

Эта информация сохраняется в файле конфигурации, пути к файлам которого можно «воспроизвести» по отдельности или сгруппировать в последовательности, с помощью другого сценария (аналогично моему сценарию «воспроизведения» или как ваши сценарии Emacs).

Он работает, используя Seekдиалог Smplayer ... xmacroманипулирует диалогом (я обнаружил, что он необходим sleep .3между командами xmacro) ... Время хранится в формате ЧЧ: ММ: СС в файле в ~/.config/smplayer... Первая строка - это Start-time, 2-я строка - это End-time, а 3-я строка предназначена для указания корневого каталога ... Эта 3-я строка используется в качестве необязательного указателя пути в следующем скрипте, который изменяет настройку конфигурации smplayer с помощью заполняя его -ssи -endpos... Конфигурационный файл временных меток называется так же, как медиа-файл, с .smplayсуффиксом ...

Так что это не все, что вы хотите, но это может помочь установить время, не печатая ...

Вот скрипт 'get timestamps':

#!/bin/bash
# Bind this script to a key-combination of your choice..
# It currently responds only to an Smplayer window.  

id=$(xdotool getactivewindow)
title="$(xwininfo -id "$id" |
  sed -n "2s/^xwininfo: Window id: \(0x[[:xdigit:]]\+\) \x22\(.*\)\x22$/\2/p")"

if [[ $title =~ ^.*\ -\ SMPlayer$ ]] ; then
  smplayer_d="$HOME/.config/smplayer"
  clip_d="$smplayer_d/clips"
  [[ ! -d "$clip_d" ]] && mkdir -p "$clip_d"
  bname="${title% - SMPlayer}"
  clip_f="$clip_d/$bname.smplay" # Same name as video, with '.smplay' suffix

  if [[ ! -f "$clip_f" \
      || "$(<"$clip_f" wc -l)" != "3" ]]
  then     # Prime with three defaults
           # FROM     TO      ROOT-dir
    echo -e "0:00:00\n0:00:00\n"     >"$clip_f"
  fi

  # Get timestamp, in seconds, of current stream position (from the current window)
  #   using the "Smplayer - seek" dialog, via  Ctrl+j
  sleep .3; echo -n "KeyStrPress Control_L  KeyStrPress j       KeyStrRelease j       KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "                       KeyStrPress Home    KeyStrRelease Home                           " | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "KeyStrPress Shift_L    KeyStrPress End     KeyStrRelease End     KeyStrRelease Shift_L  " | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "KeyStrPress Control_L  KeyStrPress c       KeyStrRelease c       KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null
  sleep .3; echo -n "                       KeyStrPress Escape  KeyStrRelease Escape                         " | xmacroplay -d 10 :0.0 &>/dev/null 
    seekHMS="$(xsel -o -b)"
  # Now set config times to defaults (in case of malformed times)
      ssHMS="0:00:00"
  endposHMS="0:00:00"
  # Now get config data from config file
  eval "$( sed -ne "1s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/    ssHMS=\"&\"/p" \
                -e "2s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/endposHMS=\"&\"/p" \
                -e "3s/.*/   root_d=\"&\"/p" "$clip_f" )"

  # Present dialog to set specifick  items.
  REPLY=$(zenity \
   --list --height=310 --width=375 \
   --title="Set Clip Start / End Time" \
   --text=" Select Clip Start / End  for time:  $seekHMS\n\
       or choose another option\n\
       \tthen click OK" \
   --column="Position" --column=" " --column="Current Setting  "  \
            "Clip Start"        " "          "$ssHMS" \
            "Clip End"          " "          "$endposHMS" \
            "UNSET Start"       " "          " " \
            "UNSET End"         " "          " " \
            "* Open directory"  " of"        "config files *" 
  ); 
  [[ "$REPLY" == "Clip Start"       ]] && sed -i -e "1 s/.*/$seekHMS/" "$clip_f"
  [[ "$REPLY" == "Clip End"         ]] && sed -i -e "2 s/.*/$seekHMS/" "$clip_f"
  [[ "$REPLY" == "UNSET Start"      ]] && sed -i -e "1 s/.*/0:00:00/"  "$clip_f"
  [[ "$REPLY" == "UNSET End"        ]] && sed -i -e "2 s/.*/0:00:00/"  "$clip_f"
  [[ "$REPLY" == "* Open directory" ]] && nautilus "$clip_d"
fi  

Следующий скрипт - мой оригинальный сценарий play. Он не зависит от сценария avove Timestamp, но для их совместной работы не потребовалось бы много времени ...

Он будет «управлять» Smplayer, который использует mplayer для внутреннего использования ... это, по крайней мере, обычный графический интерфейс, но ваш список воспроизведения должен быть в вашем текстовом редакторе ... и вы, очевидно, уже знаете об этом методе :)

Я попробовал это пару лет назад, но я забыл обо всем этом, потому что я не часто нуждаюсь в этом, но хорошо держать «закладки» ... Я рад, что вы возродили идею. Вот сценарий ... который действительно делает то же самое, что и вы, но для Smplayer (графический интерфейс mplayer).

#
# Summary: 
#   Play one video (only) in 'smplayer', passing -ss and -endpos values to 'mplayer'
#   It uses 'locate' to get the path of the video (by just its basename)
#
# eg:
#     $1                              $2   $3       $4 
#     basename                       -ss  -endpos   root 
#     "Titus - The Gorilla King.mp4"  240  30      "$HOME"  # A fascinating documentary of the long reign of a silver-back gorialla
#

[[ "$2" == "" ]] && set "$1"  0   "$3"   "$4"
[[ "$3" == "" ]] && set "$1" "$2"  36000 "$4"  # 36000 is arbitary (24 hours) 
[[ "$4" == "" ]] && root="$HOME" || root="$4"

file=( "$(locate -er "^$root/\(.*/\)*\+$1$")" )

# 1) Tweak 'smplayer.ini' to run 'mplayer' with the specified -ss and -endpos  times
# 2) Run 'smplayer' to play one video only. The time settings will hold afer exit,  
#                         so the script waits (backgrounded) for smplayer to exit
# 3) When 'smplayer' exits, set values to extreme limits:  -ss 0 -endpos 3600 
#                           or(?): TODO remove the settings enitrely, 
#                                       but that requires a different regex
a=0 z=36000     
# 
# -ss <time> (also see -sb)
# -ss 56       # Seeks to 56 seconds.
# -ss 01:10:00 #Seeks to 1 hour 10 min.
#
# -endpos <[[hh:]mm:]ss[.ms]|size[b|kb|mb]> (also see -ss and -sb)
#         Stop at given time or byte position.
#         NOTE: Byte position is enabled only for MEncoder and will not be accurate, as it can only stop at a frame boundary.  
#         When used in conjunction  with -ss option, -endpos time will shift forward by seconds specified with -ss.
#        -endpos 56        # Stop at 56 seconds.
#        -endpos 01:10:00  # Stop at 1 hour 10 minutes.
# -ss 10 -endpos 56        # Stop at 1 minute 6 seconds.
#        -endpos 100mb     # Encode only 100 MB.
#
#                                                        -ss       0                -endpos       36000                                     
#              \1                              \2      \3        \4        \5     \6            \7            \8                 
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${2}\5\6${3}\8/"  $HOME/.config/smplayer/smplayer.ini
(smplayer "$file" 
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${a}\5\6${z}\8/"  $HOME/.config/smplayer/smplayer.ini
)
exit
Peter.O
источник
Спасибо за обновление. Не могли бы вы добавить пошаговую инструкцию, как использовать скрипт?
ученик
@ user5289. Для этого нужно только, чтобы у вас был smplayer, открытый с вашим видео, и сценарий ассоциирован с сочетанием клавиш (я использую xbindkeys, но что-нибудь подойдет). Затем вы можете в любой момент фильма просто нажать на ярлык -key .. Поскольку он использует макрос, который не связан с smplayer, вы не должны ничего делать (щелчок клавиатуры или мыши), пока не появится 2-е диалоговое окно. Требуется 1-2 секунды, чтобы проверить «Это правильное окно? И т. Д.» И открыть «диалог поиска» smplayer, из которого макрос копирует текущую временную позицию, представленную в формате ЧЧ: ММ: СС. Не прерывать этот диалог. ...
Питер
продолжение ... Макрос скопирует метку времени в буфер обмена и закроет «диалог поиска». Затем появится второй диалог (диалог «zenity») ... Он предложит вам сделать 1 из 5 вещей. 1) использовать захваченную метку времени в качестве начальной позиции. 2) использовать захваченную метку времени в качестве конечной позиции. 3) Отключить запуск Позитона. 4) Unset End Positon. 5) Откройте nautilus в каталоге, в котором хранится сохраненный файл «config». Файлы конфигурации называются так же, как и «Video». (название взято из строки заголовка Smplayer) ..
Peter.O
продолжение ... Оттуда вы можете использовать любое время в ваших текущих сценариях ... Я работаю над сценарием, который интегрируется с Smplayer; Мой первый сценарий smplayer (показанный в моем первоначальном ответе) немного наивен и включает некоторые параметры. Smplayer имеет возможность сохранять историю каждого файла, который когда-либо воспроизводился. Это можно сделать в отдельном файле или в отдельных файлах ... Метод отдельных файлов (по умолчанию, я думаю (?), Является наиболее подходящим, но имена .ini хэшированы. В настоящее время я работаю над имитацией, которая имеет алгоритм ... так что следите за обновлениями :)
Peter.O
продолжение ... Вам нужно будет установить эти приложения ... xdotool xwininfo xmacro zenity sed(но у кого нет sed :), и, конечно, smplayer... Как я уже говорил, мой ответ ... это всего лишь "ассист" ... пока Но, подумав об этом прямо сейчас, когда я пишу это, это можно сделать, чтобы перейти в обычный плейлист smplayer! потому что список воспроизведения будет воспроизводиться в соответствии с сохраненными файлами .ini smplayer (файлы с хэшированными именами файлов) .. Это выглядит лучше и лучше ... но мне серьезно нужен перерыв :) ... слишком много smplayer на несколько дней. Я все еще должен завершить этот алгоритм хеширования
Peter.O
2

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

У меня это работает безупречно через плейлист ...

Этот метод требует повторной компиляции SMPlayer и определенного метода именования файлов ... Изменена только одна функция в источнике SMPlayer, и к одному и тому же исходному файлу добавлено 3 заголовка ... Я скомпилировал smplayer_0.6.8для Lucid .. Maveric и Meerkat используют smplayer_0.6.9... Одна строка в более поздней версии отличается, но это ничего не расстраивает ... Вот модифицированная функция и заголовки дляsmplayer_0.6.8

Кстати, диалог zenity в моем предыдущем ответе все еще используется для захвата времени начала и конца ...

НАПОМИНАНИЕ - Следующие исходные сегменты предназначены для smplayer_0.6.8... Файл, который нужно изменить: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Новые сегменты одинаковы для '0.6.8' и '0.6.9', но оригиналы отличаются на одну строку (очень близко к конец; как раз перед финалом return hexhash;)


Добавьте этот первый блок строк сразу под существующими #includeзаголовками

// ====================
// fred mod begin block  
#include <QFileInfo>
#include <QRegExp>
#include <QSettings>
#include "paths.h"
// fred mod end block
// ==================

Вот модифицированная функция

QString OSParser::calculateHash(QString filename) {
    QFile file(filename);

    if (!file.exists()) {
        qWarning("OSParser:calculateHash: error hashing file. File doesn't exist.");
        return QString();
    }

    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    in.setByteOrder(QDataStream::LittleEndian);
    quint64 size=file.size ();
    quint64 hash=size; 
    quint64 a;
    for(int i = 0; i < 8192; i++) {
        in >> a ; hash += a;
    };
    file.seek(size-65536);
    for(int i = 0; i < 8192; i++) {
        in >> a ; hash += a;
    };

  // =====================================================================
  // fred mod begin block
  //  
  // A mod to enable unique smplayer .ini files to be created for  
  //        content-identical media files whose file-names match
  //        a specific pattern based on two timestamps. 
  //        This is the naming pattern:

  //          
  //           name.[00:11:22].[33.44.55].mkv
  //              
  //        The two time stamps indicate the start and end  points of a 
  //         clip to be played according to  settings in the unique .ini
  //            
  //        The so named files can be, and typically will be, soft (or hard) links.   
  //        The "original" file can also named in this manner, if you like,    
  //        but that would make the "original" start playing as a clip,
  //          NOTE: soft links become invalid when you rename the original file.  
  //
  //  Note: For this system to work, you need to enable the following:
  //        In SMPlayer's GUI, open the Options dialog...
  //        In the  "General" tab... "Media settings"... 
  //          enable: 〼 "Remember settings for all files (audio track, subtitles...)" 
  //                     "Remember time position"   can be 'on' or 'off'; it is optional1
  //                                                but it is disabled for these clips.    
  //                     "Store setings in" must be: "multiple ini files" 
  //
  QFileInfo fi(filename);
  QString name = fi.fileName();
  //
  // ===================================================================
  // This RegExp expects a name-part, 
  //             followed by 2 .[timestamps]  (Begin-time and End-time)
  //             followed by a .extension
  //              
  //              .[ Begin  ].[  End   ]  
  //      eg. name.[00:11:22].[33.44.55].mkv
  //
  //    Note: The delimiter between each numeric value can be any non-numeric character.
  //          The leading dot '.' and square brackets '[]' must be as shown        
  //          HH, MM, and SS must each be 2 valid time-digits    
  //
  QRegExp rx("^.+"                      // NAME
             "\\.\\[([0-9][0-9])[^0-9]" // .[HH.
                   "([0-5][0-9])[^0-9]" //   mm.
                   "([0-5][0-9])\\]"    //   ss]
             "\\.\\[([0-9][0-9])[^0-9]" // .[HH.
                   "([0-5][0-9])[^0-9]" //   mm.
                   "([0-5][0-9])\\]"    //   ss]
             "\\.([^0-9]+)$");          // .EXTN
  //
  QString qstrIni;
  rx.setPatternSyntax(QRegExp::RegExp);
  if(rx.exactMatch(name)) {
      bool ok;
      QString qstrDlm(".");
      QString qstrBegEnd = rx.cap(1) + rx.cap(2) + rx.cap(3)
                         + rx.cap(4) + rx.cap(5) + rx.cap(6);
      hash += qstrBegEnd.toLongLong(&ok,10); // The UNIQUE-FIER
      //
      quint32 quiBegSec=(rx.cap(1).toULong(&ok,10)*3600)
                       +(rx.cap(2).toULong(&ok,10)*  60)
                       +(rx.cap(3).toULong(&ok,10));
      quint32 quiEndSec=(rx.cap(4).toULong(&ok,10)*3600)
                       +(rx.cap(5).toULong(&ok,10)*  60)
                       +(rx.cap(6).toULong(&ok,10));
      quint32 quiDifSec=(quiEndSec-quiBegSec);
      // 
      QString qstrBegIni = "-ss "     + QString::number(quiBegSec);
      QString qstrEndIni = "-endpos " + QString::number(quiDifSec);
              qstrIni    = qstrBegIni + " " + qstrEndIni;
  }
  // fred mod end block
  // =====================================================================
  // fred NOTE: the following 2 lines are a single line in smplayer-0.6.9

    QString hexhash("");
    hexhash.setNum(hash,16);

  // =====================================================================
  // fred mod begin block  
    if( !qstrIni.isEmpty() ) {
      // ** The next code line is not ideal, but should be okay so long 
      //    as SMPlayer's options are set to use Multiple .ini files.  
      //       The literal "file_settings" is HARDCODED, as It wasnt' straight
      //       forward to get the value, The rest of the path was easily available 
      //       without any significant mods, which "file_settings" would require.    
      // TODO: Check for Multiple .ini Option being enabled.
      //  
      QString  dir_settings = Paths::configPath() + "/file_settings";
      QString fqfn_settings = dir_settings + "/" + hexhash[0] + "/" + hexhash + ".ini";

      QSettings set(fqfn_settings, QSettings::IniFormat);
      set.beginGroup("file_settings");
      set.setValue(  "starting_time", "0" );
      set.setValue(  "mplayer_additional_options", qstrIni );
    }
  // fred mod end block
  // =====================================================================

    return hexhash;
}
Peter.O
источник
1

Я не смог выяснить, действительно ли они могут быть применены к спискам воспроизведения, но вы можете посмотреть в Редактировать списки решений (EDL). Вот несколько ссылок для начала:

  1. Руководство MPlayer о поддержке EDL

  2. Учебник по MPlayer EDL

  3. Редактирование видео из командной строки LinuxGazette статьи

  4. Разумный кинопроект

Если вы не возражаете против небольших пауз между видео, вы можете просто запустить mplayer несколько раз из сценария с разными EDL-файлами каждый раз. Если паузы - нет-нет, тогда, возможно, вам следует создать новое видео, как предложил varrtto.

JPC
источник
Спасибо, однако, используя командную строку, я думаю, что лучше использовать mplayers -ss и -endpos + мои макросы emacs (см. Мои дополнения к исходному посту). Что я действительно хочу, так это хороший графический интерфейс.
студент