Başlangıç ​​ve bitiş zamanlarına sahip video oynatma listeleri


10

Listedeki her video için farklı başlatma ve durdurma sürelerine sahip oynatma listeleri (video dosyaları için) oluşturmaya ve düzenlemeye izin veren linux için iyi bir GUI uygulaması (örneğin bir mplayer GUI veya banshee gibi bir şey) var mı?

Eklendi :

Şu anda böyle bir şey içeren dosyaları elle yapmak:

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

video2.mp4 -ss 112 -endpos 2112

Sonra için bir sarıcı komut dosyası var: mplayer -fs $(grep -v "^ #" $1)

Ayrıca, bu tür dosyaların düzenlenmesini biraz basitleştiren bazı emacs fonksiyonları yazdım. (Başlangıç ​​ve bitiş saatlerini ss: dd: ss biçiminden saniye ve bitiş saatine -endpos ile gerektiği gibi dönüştürmek gibi (bitiş - starttime) (birisi ilgileniyorsa makroları gönderebilirim) Ancak, bu hala çok rahatsız edici. Benim sorum, bunu yapmak için güzel bir GUI olup olmadığıdır (örneğin, bir video zaman çizelgesinde oynatma listesi için başlangıç ​​ve bitiş zamanlarını işaretlemenizi sağlar).


@ user5289: Yalnızca Ubuntu'nun yanıtlarıyla ilgileniyorsanız (sorunuzda bir dağıtımdan bahsetmediniz), hangi sitede sorulacağını seçebilirsiniz. Ubuntu'ya Sor'u tercih ediyorsanız flag, sorunuzdaki düğmeyi kullanın ve taşınmasını isteyin .
Gilles 'SO- kötü olmayı bırak'

1
@ user5289 İstediğiniz .. videoyu bir GUI'de oynatabiliyor mu (çünkü 'mplayer' kesinlikle bir GUI değil)? ... veya bir GUI'de (ayrıca) zaman konumlarını ayarlamak istiyor musunuz? .. çünkü sadece mevcut "zamanlanmış komutları" kullanmak için Smplayer kullanabilirsiniz .. Ben sadece bunu yapmak için bir komut dosyası yazdım .. Ben komut dosyası olarak göndermek ve cevap .. birisi interesing bulabilirsiniz .. Kesinlikle yönteminizi ilginç buldum .. ve Smplayer'a adapte oldum ..
Peter.O

@ fred.bear, evet mesele şu ki, bir GUI'de zaman pozisyonlarını ayarlamak, tüm çalma listesini bir GUI'de rahat bir şekilde düzenlemek istiyorum. (Bir GUI'de oynamak önemli değildir)
öğrenci

@ user5289: Bir GUI'de zaman pozisyonlarını ayarlamak oldukça mümkün ... Smplayer ile yapıyorum .... Yeni timestampsbetiği sadece bir play-it-in-Smplayerbetiği gösteren orijinal cevaba
ekledim

Yanıtlar:


3

Belki soruyu yanlış anlıyorum, çünkü İngilizce benim ilk dilim değil, ancak videoyu böyle bir oynatma listesi yapmak yerine Kino gibi bir araçla düzenleseniz daha iyi olmaz mıydı ?

Başlangıç ​​ve bitiş zamanlarını istediğiniz gibi ayarlayabilirsiniz ve bunun zor olacağını düşünmüyorum.


2
Evet, Kino ya da bunun gibi bir şey kullanarak video kesmeyi biliyorum. Soru gerçekten yeni videolar yapmak değil, oynatma listeleriyle ilgili. Bu tür çalma listeleri oluşturmak çok hızlı, esnek ve ek disk alanı gerektirmez.
öğrenci

3

GÜNCELLEME-2: Aşağıdaki komut dosyasını gönderdikten sonra, zaman konumlarını (GUI'de) ayarlamanın başka bir yolunun bir Altyazı Düzenleyicisi (ör. gnome-subtitles) Kullanmak benim için şaşkınlık yarattı . Sadece "fantom altyazıları" başlangıç ​​ve bitiş konumlarını işaretlemek için tıklayabilirsiniz; aslında dosya yolunuzu ve yorumlarınızı "altyazı" olarak koyabilirsiniz ... Bazı formatlar uygun değildir (örn. kare numaralarını kullanarak) .. 'ViPlay Altyazı Dosyası', Power DivX ve 'Adobe Encore DVD' görünümü iyi.

UPDATE-1; yeni bir komut dosyası ... Bu komut dosyası size tümleşik çalma listesi yeteneği sağlamaz, ancak hiçbir şey yazmanıza gerek kalmadan Smplayer'da başlangıç ​​ve bitiş saatlerini seçmenize ve kaydetmenize ve değiştirmenize izin verir.

Bu bilgi, dosya yolları ayrı ayrı "oynatılabilen" veya başka bir komut dosyası aracılığıyla ('play' komut dosyasına benzer veya Emacs komut dosyalarınız gibi) bir dizi halinde gruplandırılabilen bir yapılandırma dosyasına kaydedilir.

Smplayer'ın Seekiletişim kutusunu kullanarak çalışır ... iletişim kutusunu xmacromanipüle eder ( sleep .3xmacro komutları arasında ihtiyaç duyduğunu buldum ) ... Zamanlar HH: MM: SS formatında bir dosyada saklanır ~/.config/smplayer... 1. satır Başlangıç ​​zamanı, 2. satır Bitiş zamanı ve 3. satır bir kök dizin belirtmek için orada ... Bu 3. satır, bir smplayer yapılandırma ayarını değiştiren folow-up betiği tarafından isteğe bağlı bir yol göstergesi olarak kullanılır -ssve ile kullanıma hazırlama -endpos... Zaman damgaları yapılandırma dosyası bir .smplaysonekle medya dosyasıyla aynı şekilde adlandırılır ...

Yani bu istediğiniz her şey değil, ancak zaman yazmadan ayarlamanıza yardımcı olabilir ...

İşte 'zaman damgalarını al' betiği:

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

Aşağıdaki komut dosyası benim orijinal 'play' scrpt'imdir.

Dahili olarak mplayer kullanan Smplayer'ı 'sürecek' .. en azından normal bir GUI, ancak çalma listenizin metin düzenleyicinizde olması gerekir .. ve bu yöntemi zaten biliyorsunuz :)

Bunu birkaç yıl önce denedim, ama sık sık böyle bir şeye ihtiyacım olmadığı için her şeyi unutmuştum, ama "yer imlerini" saklamak güzel ... Fikri dirilttiğinize sevindim. İşte senaryo ... bu sadece sizin yaptığınızla aynı şeyi yapıyor, ama Smplayer'a (bir mplayer GUi)

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

Güncelleme için teşekkürler. Komut dosyasının nasıl kullanılacağına ilişkin adım adım talimatlar ekleyebilir misiniz?
öğrenci

@ user5289. Sadece videonuzla açık bir oyuncuya sahip olmanız gerekir ve komut dosyası kısayol tuşu ile ilişkilidir (xbindkeys kullanıyorum, ancak her şey yapacaktır) .. Filmin herhangi bir noktasında kısayol tuşuna basabilirsiniz -key .. Smplayer ile ilgisi olmayan bir makro kullandığından, 2. iletişim kutusu görünene kadar hiçbir şey yapmamalısınız (klavye veya fare tıklaması). "Bu doğru pencere mi? Vb." Öğesinin kontrol edilmesi ve makronun SS: MM: SS'de sunulan geçerli saat konumunu kopyaladığı "ara iletişim kutusunu" açmak için 1-2 saniye gerekir. Bu iletişim kutusunu kesmeyin. ...
Peter.O

devamı ... Makro, zaman damgasını klipe kopyalayıp "arama iletişim kutusu" nu kapatacak. Ardından ikinci bir iletişim kutusu görüntülenecektir ("zenginlik" iletişim kutusu) ... 5 şeyden 1'ini yapmanızı isteyecektir. 1) yakalanan zaman damgasını Başlangıç ​​konumu olarak kullanın. 2) yakalanan zaman damgasını Son konum olarak kullanın. 3) Başlangıç ​​Konumunu Ayarla. 4) Son Konumunu Ayarla. 5) Kayıtlı "config" dosyasını tutan dizinde nautilus'u açın. Yapılandırma dosyaları Video ile aynı şekilde adlandırılır. (isim Smplayer'ın başlık çubuğundan alınmıştır) ..
Peter.O

devamı ... O anki komut dosyalarınızda zamanları istediğiniz gibi kullanabilirsiniz ... Smplayer ile bütünleşen bir betik üzerinde çalışıyorum; İlk smplayer betiğim (orijinal cevabımda gösterilen) biraz naif ve bazı seçeneklerde geziliyor .. Smplayer'ın oynatılan her dosyanın geçmişini tutma seçeneği var. Bu tek bir dosya veya tek tek dosyalarda yapılabilir ... Bireysel dosya yöntemi (varsayılan, bence (?), En uygun, ancak .ini isimleri karma. Şu anda sahip olan taklit üzerinde çalışıyorum algoritma ... bu yüzden bizi izlemeye devam edin :)
Peter.O

devamı ... Bu uygulamaları yüklemeniz gerekecek .. xdotool xwininfo xmacro zenity sed(ama kim sed yok :) ve tabii ki smplayer... Bahsettiğim gibi cevabım .. sadece bir 'asist' .. şimdiye kadar , ama şimdi düşünürken, bunu yazarken , normal smplayer çalma listesine girilebilir ! çünkü çalma listesi kaydetme smplayer .ini dosyalarına (karma dosya adlarına sahip olanlar) uygun olarak çalacaktır. Hala bu karma algoritmayı bitirmeliyim
Peter

2

Bu ikinci yanıtı ekledim, çünkü SMPlayer'da normal bir çalma listesi olarak çalışıyor ve netlik için daha iyi ...

Çalma listesi aracılığıyla kusursuz bir şekilde çalıştım ...

Bu yöntem, SMPlayer'ın yeniden derlenmesini ve belirli bir dosya adlandırma yöntemini gerektirir ... SMPlayer kaynağında yalnızca bir işlev değiştirilir ve aynı tek kaynak dosyaya 3 başlık eklenir ... smplayer_0.6.8Lucid için derledim .. Maveric ve Meerkat kullanımı smplayer_0.6.9.. Sonraki sürümde bir satır farklı, ama bu hiçbir şey rahatsız değil ... İşte için değiştirilmiş işlevi ve başlıklarısmplayer_0.6.8

btw, önceki cevabımdaki zenity iletişim kutusu başlangıç ​​ve bitiş zamanlarını yakalamak için hala kullanılıyor ...

HATIRLATMA - Aşağıdaki kaynak segmentleri içindir smplayer_0.6.8... Değiştirilecek dosya şöyledir: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Yeni segmentler '0.6.8' ve '0.6.9' için aynıdır, ancak orijinaller bir satıra (çok yakın son; finalden hemen önce return hexhash;)


Bu ilk satır bloğunu mevcut #includebaşlıkların hemen altına ekleyin

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

İşte değiştirilen işlev

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

Bunların gerçekten çalma listelerine uygulanıp uygulanamayacağını bulamadım, ancak Karar Listelerini Düzenle'ye (EDL) bakabilirsiniz. Başlamanız için bazı bağlantılar şunlardır:

  1. EDL desteği hakkında MPlayer kılavuzu

  2. MPlayer EDL eğitimi

  3. LinuxGazette komut satırından video düzenleme

  4. Mantıklı sinema projesi

Videolar arasındaki küçük duraklamaları önemsemiyorsanız, mplayer'ı farklı EDL dosyaları olan bir komut dosyasından birkaç kez çalıştırabilirsiniz. Duraklamalar bir hayır ise, belki de önerilen varrtto gibi yeni bir video oluşturmanız gerekir.


Bununla birlikte, komut satırını kullanarak teşekkürler, mplayers -ss ve -endpos + emacs makrolarımı kullanmanın daha iyi bir yol olduğunu düşünüyorum (orijinal yazıya yaptığım eklere bakın). Gerçekten istediğim güzel bir GUI.
Öğrenci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.