Списки відтворення відео з часом початку та закінчення


10

Чи є хороший GUI-додаток (наприклад, графічний інтерфейс для плеєра або щось на зразок banshee) для Linux, який дозволяє створювати та редагувати списки відтворення (для відеофайлів) з різними часом початку та зупинки для кожного відео в списку?

Додано :

На даний момент я створюю вручну файли, які містять щось подібне:

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

video2.mp4 -ss 112 -endpos 2112

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

Крім того, я написав деякі функції emacs, які дещо спрощують редагування таких файлів. (Як і перетворення початкового та кінцевого часу з hh: mm: ss формат у секунди та endtime у відносне положення (endtime - starttime), як того вимагає -endpos (я можу розміщувати макроси, якщо когось цікавить). Однак це все ще занадто незручно. Тому моє запитання полягає в тому, чи є приємний графічний інтерфейс для цього (наприклад, який дозволяє позначити на часовій шкалі відео час початку та кінця для списку відтворення тощо).


@ user5289: Якщо вас цікавлять лише відповіді на Ubuntu (ви не згадали про розповсюдження у своєму запитанні), ви можете вибрати, на якому веб-сайті звертатись. Якщо ви віддаєте перевагу Запитати Ubuntu, скористайтеся flagкнопкою у вашому запитанні та попросіть її перенести.
Жил "ТАК - перестань бути злим"

1
@ user5289 Чи все, що ви хочете .., щоб мати можливість відтворювати відео в графічному інтерфейсі (адже 'mplayer', звичайно, не є графічним інтерфейсом)? ... чи ви хочете мати можливість встановити часові позиції в графічному інтерфейсі (також)? .. тому що ви можете просто використовувати Smplayer для використання наявних "приурочених команд" .. Я написав сценарій, щоб зробити саме це .. Я опублікую сценарій як і відповім .. хтось може вважати це цікавим .. Я, звичайно, знайшов ваш метод цікавим .. і я щойно адаптував його до Smplayer ..
Peter.O

@ fred.bear, так, справа в тому, що я хочу мати можливість встановити часові позиції в графічному інтерфейсі, відредагувати весь список відтворення в графічному інтерфейсі якось зручно. (Гра в графічному інтерфейсі не важлива)
студент

@ user5289: Цілком можливо встановити часові позиції в графічному інтерфейсі ... Я це роблю з Smplayer .... Я додав новий timestampsскрипт до своєї оригінальної відповіді, який показував лише play-it-in-Smplayerсценарій
Peter.O

Відповіді:


3

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

Ви можете регулювати час початку та зупинки, як хочете, і я не думаю, що це буде так складно.


2
Так, я знаю, як вирізати відео за допомогою Kino чи чогось подібного. Питання справді в списках відтворення, а не в створенні нових відео. Створення таких списків відтворення буде дуже швидким, гнучким і не вимагає додаткового місця на диску.
студент

3

ОНОВЛЕННЯ-2: Після подання наступного сценарію мені стало зрозуміло, що ще одним способом встановлення часових позицій (у графічному інтерфейсі) є використання редактора субтитрів (наприклад, gnome-subtitles). Ви можете просто натиснути, щоб позначити початкові та кінцеві позиції "фантомних субтитрів"; насправді ви можете розмістити свій шлях до файлів та коментарі як "підзаголовки" ... Деякі формати не підходять (наприклад, використовуючи номери кадрів). добре.

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

Ця інформація зберігається у конфігураційному файлі, файлові контури якого можна "відтворити" окремо або згрупувати в послідовність за допомогою іншого сценарію (подібного до мого сценарію "відтворити" або як ваших сценаріїв Emacs).

Він працює за допомогою Seekдіалогового вікна Smplayer ... xmacroманіпулює діалоговим вікном (я виявив, що він потрібен sleep .3між командами xmacro) ... Часи зберігаються у форматі HH: MM: SS у файлі у ~/.config/smplayer... Перший рядок - це Початковий час, 2-й рядок - Кінцевий час, а 3-й рядок - там, щоб вказати кореневу директорію ... Цей 3-й рядок використовується як необов'язковий індикатор контуру в наступному скрипті, який змінює налаштування конфігурації програвача загрунтуючи його -ssта -endpos... Конфігураційний файл часових міток називається таким же, як медіа-файл, із .smplayсуфіксом ...

Отже, це не все, що ви хочете, але це може допомогти налаштувати час без будь-якого введення ...

Ось сценарій "отримати часові позначки":

#!/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  

Наступний сценарій є моїм оригінальним сценарієм "відтворити". Він не залежить від сценарію Avota Timestamp, але це не займе багато, щоб змусити їх працювати разом ...

Він буде "водити" Smplayer, який використовує mplayer внутрішньо. Це, принаймні, звичайний графічний інтерфейс, але ваш список відтворення повинен бути в текстовому редакторі .. і ви, очевидно, знаєте про цей метод вже :)

Я спробував це пару років тому, але все про це забув, тому що мені часто не потрібна така річ, але добре зберігати «закладки». Радий, що ви відновили ідею. Ось сценарій ... який насправді робить лише те, що ви робили, але для Smplayer (GUI 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

Дякуємо за оновлення Чи можете ви додати покрокову інструкцію використання сценарію?
студент

@ user5289. Потрібно лише вимагати, щоб у вас було відкрито програміст зі своїм відео, а сценарій пов’язаний із клавішею швидкої клавіші (я використовую xbindkeys, але все, що робити). Потім можна в будь-який момент фільму просто натиснути ярлик -key .. Оскільки він використовує макрос, не пов’язаний із гравцем, вам нічого не потрібно робити (клацання клавішею чи мишкою), поки не з’явиться 2-е діалогове вікно. Потрібно 1-2 секунди, щоб встановити прапорець "Це правильне вікно? Тощо" та відкрити діалогове вікно "Шукати" гравця, з якого макрос копіює поточну позицію часу, представлену в HH: MM: SS .. Не переривайте це діалогове вікно. ...
Пітер.О

продовження ... Макрос скопіює часову позначку на кліпард, а потім закриє "діалогове вікно пошуку". З'явиться друге діалогове вікно (діалог "zenity"). Це запропонує вам зробити 1 з 5 речей. 1) використовувати захоплену часову позначку як позицію Старту. 2) використовувати захоплену часову позначку як кінцеву позицію. 3) Зніміть Стартовий Позитон. 4) Зніміть кінець позиції. 5) Відкрийте nautilus у каталозі, в якому зберігається збережений файл "config". Файли конфігуровані ідентично відео. (ім'я взято із заголовка Smplayer) ..
Peter.O

продовження ... Звідти ви можете використовувати часи, як завгодно, у своїх поточних сценаріях ... Я працюю над сценарієм, який інтегрується зі Smplayer; Мій перший скрипт-програвач (показаний у моїй оригінальній відповіді) трохи наївний, і він спрацьовує на деякі варіанти .. Smplayer має можливість зберігати історію кожного файлу, який коли-небудь відтворювався. Це можна зробити в одному файлі або в окремих файлах ... Індивідуальний метод файлу (я вважаю, що за замовчуванням (?) Є найбільш підходящим, але .ini імена є хешованими. Зараз я працюю над імітацією, яка має алгоритм ... так що слідкуйте :)
Пітер.O

продовження ... Вам потрібно буде встановити ці додатки .. xdotool xwininfo xmacro zenity sed(але хто не має сед :), і звичайно smplayer... Як я вже згадував про це, моя відповідь .. це поки що "асистент" .. поки що Але, думаючи про це зараз, коли я це пишу, це може бути зроблено, щоб прищепитися до звичайного списку плейлистів! тому що список відтворення буде грати відповідно до збережених файлів .ini збереженого smplayer. (файли з хешованими іменами) .. Це виглядає кращим і кращим .. але я серйозно потребую перерви :) .. Занадто багато гравця на кілька днів. Я все ще повинен закінчити алгоритм хешування
Пітер

2

Я додав цю другу відповідь, оскільки вона працює як звичайний список відтворення в SMPlayer, і тут краще для наочності ...

У мене це працювало бездоганно через список відтворення ...

Цей метод вимагає повторної компіляції SMPlayer та конкретного методу іменування файлів ... Змінена лише одна функція в джерелі SMPlayer, і до цього ж єдиного вихідного файлу додаються 3 заголовки ... Я склав smplayer_0.6.8для Lucid .. . Maveric та Meerkat використовують smplayer_0.6.9.. Один рядок у пізнішій версії відрізняється, але це нічого не порушує ... Ось модифікована функція та заголовки дляsmplayer_0.6.8

btw, діалог із значенням в моїй попередній відповіді все ще використовується для зйомки часу початку та закінчення ...

REMINDER - Наступні вихідні сегменти призначені для 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;
}

1

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

  1. Посібник MPlayer про підтримку EDL

  2. Навчальний посібник MPlayer EDL

  3. Редагування відео з статті командного рядка LinuxGazette

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

Якщо ви не заперечуєте проти невеликих пауз між відео, ви можете просто запустити mplayer кілька разів зі сценарію з різними файлами EDL кожен раз. Якщо паузи - ні-ні, то, можливо, вам слід створити нове відео так, як запропоновано varrtto.


Однак, завдяки командному рядку, я думаю, що кращий спосіб використовувати mplayers -ss та -endpos + мої макроси emacs (див. Мої доповнення до оригінальної публікації). Мені дуже хочеться приємного графічного інтерфейсу.
студент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.