Daftar putar video dengan waktu mulai dan berakhir

10

Apakah ada aplikasi GUI yang baik (misalnya GUI mplayer atau sesuatu seperti banshee) untuk linux yang memungkinkan untuk membuat dan mengedit daftar putar (untuk file video) dengan waktu mulai dan berhenti yang berbeda untuk setiap video dalam daftar?

Ditambahkan :

Saat ini saya membuat file secara manual yang berisi sesuatu seperti itu:

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

video2.mp4 -ss 112 -endpos 2112

Lalu saya punya skrip wrapper untuk: mplayer -fs $(grep -v "^ #" $1)

Selanjutnya saya telah menulis beberapa fungsi emacs yang menyederhanakan pengeditan file-file tersebut sedikit. (Seperti mengkonversi waktu mulai dan akhir dari format jj: mm: dd ke detik dan waktu akhir ke posisi relatif (waktu-akhir - waktu mulai) seperti yang disyaratkan oleh -pos (saya dapat memposting makro jika seseorang tertarik). Namun, itu masih terlalu tidak nyaman. Jadi pertanyaan saya adalah apakah ada GUI yang bagus untuk melakukan ini (misalnya yang memungkinkan Anda untuk menandai dalam timeline video waktu mulai dan berakhir untuk daftar putar dan sebagainya).

siswa
sumber
@ user5289: Jika Anda hanya tertarik pada jawaban untuk Ubuntu (Anda tidak menyebut distribusi dalam pertanyaan Anda), Anda dapat memilih situs apa yang akan ditanyakan. Jika Anda lebih suka Tanya Ubuntu, gunakan flagtombol pada pertanyaan Anda dan minta dimigrasi.
Gilles 'SANGAT berhenti menjadi jahat'
1
@ user5289 Apakah semua yang Anda inginkan .. dapat memutar video dalam GUI (karena 'mplayer' tentu bukan GUI)? ... atau Anda ingin dapat mengatur posisi waktu dalam GUI (juga)? .. karena Anda hanya dapat menggunakan Smplayer untuk menggunakan "perintah waktunya" yang ada. .. Saya telah menulis skrip untuk melakukan hal itu .. Saya akan memposting skrip sebagai dan menjawab .. seseorang mungkin menemukan itu menarik .. saya tentu menemukan metode Anda menarik .. dan saya baru saja mengadaptasinya ke Smplayer ..
Peter.O
@ fred.bear, ya intinya adalah, bahwa saya ingin dapat mengatur posisi waktu dalam GUI, edit seluruh daftar main dalam GUI dengan cara yang nyaman. (Bermain dalam GUI tidak penting)
siswa
@ user5289: Sangat mungkin untuk mengatur posisi waktu dalam GUI ... Saya melakukannya dengan Smplayer .... Saya telah menambahkan timestampsskrip baru ke jawaban asli saya yang hanya menunjukkan play-it-in-Smplayerskrip
Peter.O

Jawaban:

3

Mungkin saya salah menjawab, karena bahasa Inggris bukan bahasa pertama saya, tetapi bukankah lebih baik jika Anda mengedit video dengan alat seperti Kino daripada membuat daftar putar seperti itu?

Anda dapat menyesuaikan waktu mulai dan berhenti seperti yang Anda inginkan, dan saya pikir itu tidak akan sulit.

varrtto
sumber
2
Ya, saya tahu cara memotong video menggunakan Kino atau sesuatu seperti itu. Pertanyaannya sebenarnya tentang daftar putar, bukan tentang membuat video baru. Membuat daftar putar seperti itu akan sangat cepat, fleksibel dan tidak memakan ruang disk tambahan.
siswa
3

UPDATE-2: Setelah mengirimkan skrip berikut, saya sadar bahwa cara lain untuk mengatur posisi waktu (dalam GUI) adalah dengan menggunakan Subtitle Editor (mis. gnome-subtitles). Anda cukup mengeklik untuk menandai posisi awal dan akhir "subtitle hantu"; sebenarnya Anda dapat meletakkan path file dan komentar sebagai "subtitle" ... Beberapa format tidak cocok (mis. menggunakan nomor bingkai) .. 'ViPlay Subtitle File', Power DivX, dan tampilan 'Adobe Encore DVD' baik.

UPDATE-1; skrip baru ... Skrip ini tidak akan memberi Anda kemampuan daftar putar terintegrasi, tetapi skrip ini akan memungkinkan Anda untuk memilih dan menyimpan dan memodifikasi waktu awal dan akhir dalam Smplayer, tanpa perlu mengetik apa pun.

Info ini disimpan dalam file konfigurasi, path-file yang dapat "dimainkan" secara individual, atau dikelompokkan dalam urutan, melalui skrip lain (mirip dengan skrip 'play' saya, atau seperti skrip Emacs Anda) ..

Ia bekerja dengan memanfaatkan Seekdialog Smplayer ... xmacromemanipulasi dialog (saya telah menemukan bahwa itu membutuhkan sleep .3antara perintah xmacro) ... Waktu disimpan dalam HH: MM: format SS dalam file di ~/.config/smplayer... Baris pertama adalah Waktu mulai, baris ke-2 adalah Waktu-akhir, dan baris ke-3 ada untuk menentukan direktori root ... Baris ke-3 ini digunakan sebagai indikator jalur opsional oleh skrip berikut yang memodifikasi pengaturan konfigurasi smplayer dengan priming dengan -ssdan -endpos... File konfigurasi cap waktu dinamai sama dengan file media, dengan .smplayakhiran ...

Jadi ini bukan semua yang Anda inginkan, tetapi mungkin membantu mengatur waktu tanpa mengetik ...

Berikut ini skrip 'dapatkan cap waktu':

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

Skrip berikut adalah skrip 'play "asli saya. Ini tidak tergantung pada skrip Timestamp avove, tetapi tidak perlu banyak untuk membuat mereka bekerja bersama ...

Ini akan 'mengarahkan' Smplayer, yang menggunakan mplayer secara internal .. itu, setidaknya, adalah GUI normal, tetapi daftar putar Anda harus ada di editor teks Anda .. dan Anda jelas sudah tahu tentang metode itu :)

Saya sudah mencoba ini beberapa tahun yang lalu, tetapi saya sudah lupa semua itu karena saya tidak sering membutuhkan hal seperti itu, tetapi bagus untuk menyimpan "bookmark" .. Saya senang Anda telah menghidupkan kembali ide itu. Ini adalah skrip ... yang benar-benar hanya melakukan hal yang sama seperti yang telah Anda lakukan, tetapi untuk Smplayer (seorang 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
Peter.O
sumber
Terima kasih atas pembaruannya. Bisakah Anda menambahkan instruksi langkah demi langkah cara menggunakan skrip?
siswa
@ user5289. Seharusnya hanya mengharuskan Anda memiliki smplayer terbuka dengan video Anda, dan skrip dikaitkan dengan sebagai tombol pintas (saya menggunakan xbindkeys, tetapi apa pun akan dilakukan) .. Anda kemudian dapat, pada titik mana saja dalam film, cukup tekan pintasan Anda -kunci .. Karena ia menggunakan makro yang tidak terkait dengan smplayer, Anda tidak boleh melakukan apa pun (klik keyboard atau mouse) hingga dialog kedua muncul. Diperlukan 1-2 detik untuk memeriksa "Apakah ini jendela kanan? Dll" dan buka "dialog cari" dari mana makro menyalin posisi waktu saat ini yang disajikan dalam HH: MM: SS .. Jangan hentikan dialog ini. ...
Peter.O
lanjutan ... Makro akan menyalin cap waktu ke clipboard dan kemudian menutup "dialog mencari" .. Dialog kedua akan muncul (dialog "zenity") ... Itu akan meminta Anda untuk melakukan 1 dari 5 hal. 1) gunakan cap waktu yang ditangkap sebagai posisi Mulai. 2) menggunakan cap waktu yang ditangkap sebagai posisi Akhir. 3) Membatalkan Pengaturan Posisi. 4) Unset End End Positon. 5) Buka nautilus di direktori yang menyimpan file "config" yang disimpan .. File config diberi nama secara identik dengan Video. (namanya diambil dari bilah judul Smplayer) ..
Peter.O
lanjutan ... Dari sana Anda dapat menggunakan waktu sesuka Anda dalam skrip saat ini ... Saya sedang mengerjakan skrip yang terintegrasi dengan Smplayer; Skrip smplayer pertama saya (ditampilkan dalam jawaban asli saya) agak naif, dan naik pada beberapa opsi .. Smplayer memiliki opsi untuk menyimpan riwayat setiap file yang pernah diputar. Ini dapat dilakukan dalam satu file atau file individual ... Metode file individual (default, saya pikir (?), Adalah yang paling cocok, tetapi nama .ini di-hash. Saya saat ini sedang mengerjakan peniruan yang memiliki algoritma ... jadi tunggu saja :)
Peter.O
lanjutan ... Anda harus memiliki aplikasi ini diinstal .. xdotool xwininfo xmacro zenity sed(tapi siapa yang tidak punya :) :), dan tentu saja smplayer... Seperti yang saya sebutkan itu jawaban saya .. itu hanya 'asssist' .. sejauh ini , tetapi memikirkannya sekarang, ketika saya menulis ini, dapat dibuat untuk dicangkokkan ke dalam daftar pemain smplayer normal! karena playlist akan bermain sesuai dengan save smplayer .ini file (yang dengan nama file hash) .. Ini terlihat lebih baik dan lebih baik .. tapi aku serius perlu istirahat :) .. terlalu banyak smplayer selama beberapa hari. Saya masih harus menyelesaikan algoritma hashing
Peter.O
2

Saya telah menambahkan jawaban kedua ini, karena berfungsi sebagai daftar putar normal di SMPlayer, dan lebih baik di sini untuk kejelasan ...

Saya sudah menggunakannya dengan sempurna melalui daftar putar ...

Metode ini memerlukan kompilasi ulang SMPlayer, dan metode penamaan file tertentu ... Hanya satu fungsi di sumber SMPlayer yang dimodifikasi, dan 3 header ditambahkan ke file sumber tunggal yang sama ... Saya telah dikompilasi smplayer_0.6.8untuk Lucid .. Penggunaan Maveric dan Meerkat smplayer_0.6.9.. Satu baris dalam versi yang lebih baru berbeda, tetapi itu tidak mengecewakan apa pun ... Berikut adalah fungsi dan header yang dimodifikasi untuksmplayer_0.6.8

btw, dialog zenity di jawaban saya sebelumnya masih digunakan untuk menangkap waktu mulai dan akhir ...

PENGINGAT - Segmen sumber berikut adalah untuk smplayer_0.6.8... File yang akan diubah adalah: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Segmen baru sama untuk '0.6.8' dan '0.6.9', tetapi aslinya berbeda dengan satu baris (sangat dekat dengan akhir; tepat sebelum final return hexhash;)


Tambahkan blok baris pertama ini tepat di bawah #includeheader yang ada

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

Ini adalah fungsi yang dimodifikasi

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
sumber
1

Saya gagal menemukan apakah ini benar-benar dapat diterapkan ke daftar putar tetapi Anda dapat melihat ke Edit Daftar Keputusan (EDL). Berikut ini beberapa tautan untuk Anda mulai:

  1. Manual MPlayer tentang dukungan EDL

  2. Tutorial MPlayer EDL

  3. Pengeditan video dari baris perintah artikel LinuxGazette

  4. Proyek sinema yang masuk akal

Jika Anda tidak keberatan jeda kecil di antara video Anda bisa menjalankan mplayer beberapa kali dari sebuah skrip dengan file EDL yang berbeda setiap kali. Jika jeda adalah larangan, maka mungkin Anda harus membuat video baru seperti yang disarankan varrtto.

jpc
sumber
Terima kasih, bagaimanapun, menggunakan baris perintah, saya pikir menggunakan mplayers -ss dan -endpos + makro emacs saya adalah cara yang lebih baik (lihat tambahan saya ke posting asli). Yang benar-benar saya inginkan adalah GUI yang bagus.
siswa