具有开始时间和结束时间的视频播放列表


10

Linux是否有一个好的GUI应用程序(例如mplayer GUI或banshee之类的东西),它允许制作和编辑播放列表(对于视频文件),并且列表上每个视频的开始和停止时间都不同?

新增

目前,我手动制作包含以下内容的文件:

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

video2.mp4 -ss 112 -endpos 2112

然后我有一个包装脚本: mplayer -fs $(grep -v "^ #" $1)

此外,我已经编写了一些emacs函数,这些函数可以稍微简化此类文件的编辑。(就像-endpos所要求的那样,将开始和结束时间从hh:mm:ss格式转换为秒,将结束时间转换为相对位置(结束时间-开始时间)(如果有人感兴趣,我可以发布宏)。但是,这仍然太不舒服。所以我的问题是,是否有一个不错的GUI来执行此操作(例如,它允许您在视频时间轴中标记播放列表的开始时间和结束时间等)。


@ user5289:如果您只对Ubuntu的答案感兴趣(您未在问题中提及发行版),则可以选择要在哪个网站上提问。如果您更喜欢Ask Ubuntu,请使用flag问题上的按钮并要求将其迁移。
吉尔(Gilles)'所以

1
@ user5289是否只需要能够在GUI中播放视频(因为'mplayer'当然不是GUI)?...或者您是否希望能够在GUI中设置时间位置(也是)?..因为您可以只使用Smplayer来使用现有的“定时命令” ..我已经编写了一个脚本来执行此操作..我将脚本发布为答案。.有人可能会发现它很有趣。.我当然发现您的方法很有趣..而我刚刚将其调整为Smplayer ..
Peter.O 2011年

@ fred.bear,是的,要点是,我希望能够在GUI中设置时间位置,以某种舒适的方式在GUI中编辑整个播放列表。(玩GUI并不重要)
学生

@ user5289:很有可能在GUI中设置时间位置...我用Smplayer做到了...。我已将新timestamps脚本添加到我的原始答案中,该play-it-in-Smplayer脚本仅显示了一个脚本
Peter.O

Answers:


3

也许我弄错了问题,因为英语不是我的母语,但是如果您使用诸如Kino之类的工具编辑视频而不是制作这样的播放列表,这会更好吗?

您可以根据需要调整开始和停止时间,我认为这没有那么困难。


2
是的,我知道如何使用Kino或类似的方式剪辑视频。问题实际上是关于播放列表,而不是制作新视频。制作这样的播放列表将非常快速,灵活并且不占用额外的磁盘空间。
学生

3

UPDATE-2:提交以下脚本后,我意识到,设置时间位置(在GUI中)的另一种方法是使用字幕编辑器(例如gnome-subtitles)。您可以单击以标记“幻影字幕”的开始和结束位置。实际上,您可以将文件路径和注释作为“字幕”放入。...某些格式不适合(例如,使用帧编号)。“ ViPlay字幕文件”,Power DivX和“ Adob​​e Encore DVD”外观好。

UPDATE-1; 一个新的脚本...该脚本不会为您提供集成的播放列表功能,但是它将允许您在Smplayer中选择,保存和修改开始和结束时间,而无需键入任何内容。

此信息保存在配置文件中,该文件的文件路径可以通过另一个脚本(类似于我的“播放”脚本,或者像您的Emacs脚本)单独“播放”或按顺序分组。

它通过利用Smplayer的Seek对话框来工作... xmacro操纵对话框(我发现它sleep .3在xmacro命令之间需要)...时间以HH:MM:SS格式存储在文件中~/.config/smplayer...第一行是开始时间,第二行是结束时间,第三行用于指定根目录...下面的脚本用作后续脚本的可选路径指示符,该脚本通过以下方式修改smplayer配置设置:用吸它-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  

以下脚本是我最初的“播放”脚本,它独立于上述的Timestamp脚本,但是并不需要花费很多时间就可以使它们一起工作...

它会“驱动” Smplayer,内部使用mplayer。至少它是一个普通的GUI,但是您的播放列表必须在文本编辑器中..您显然已经知道该方法了:)

我在几年前尝试过这种方法,但是由于我不需要经常使用这种东西,所以我已经忘记了这一切,但是保留“书签”是一件好事。这是脚本……实际上只和您以前做的一样,但是对Smplayer(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

感谢更新。您可以逐步说明如何使用脚本吗?
学生

@ user5289。它只需要打开视频播放器即可,并且脚本与快捷键相关联(我使用xbindkeys,但是任何操作都可以)。然后,您可以在电影中的任何位置按快捷键-key ..因为它利用了一个与smplayer无关的宏,所以在出现第二个对话框之前,您不可以执行任何操作(键盘或鼠标单击)。检查“这是正确的窗口吗?等”并打开smplayer的“查找对话框”,该宏需要1-2秒的时间,宏会从中复制当前时间位置(以HH:MM:SS表示)。请勿中断此对话框。 ...
Peter.O

继续...宏会将时间戳复制到剪贴板,然后关闭“查找对话框”。然后将出现第二个对话框(“ zenity”对话框),提示您执行5件事之一。1)使用捕获的时间戳作为开始位置。2)使用捕获的时间戳记作为结束位置。3)取消启动位置。4)未设定终点位置。5)在保存已保存的“ config”文件的目录中打开nautilus。.config文件的名称与Video相同。(名字是从的SMPlayer的标题栏抽放)..
Peter.O

继续...从那里,您可以在当前脚本中随意使用时间...我正在研究一个与Smplayer集成的脚本;我的第一个smplayer脚本(显示在我的原始答案中)有些天真,并且在某些选项上有所改动。.Smplayer具有一个选项,可以保存曾经播放过的每个文件的历史记录。这可以在单个文件或单个文件中完成...单个文件方法(默认情况下,我认为是(?))最合适,但是.ini名称是哈希值。我目前正在模拟具有算法...敬请关注:)
Peter.O 2011年

继续...您将需要安装这些应用程序.. xdotool xwininfo xmacro zenity sed(但是谁还没有被sed :),当然smplayer...正如我所说,我的回答..到目前为止,它只是一个“助手” .. ,但现在考虑一下,在我撰写本文时,可以将其移植到正常的smplayer播放列表中!因为播放列表将根据保存的smplayer .ini文件(带有散列文件名的文件)播放。.这看起来更好,但是..我真的需要休息一下。我仍然需要完成该哈希算法
Peter.O 2011年

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;
}

1

我没有找到它们是否真的可以应用于播放列表,但您可以考虑编辑决策列表(EDL)。以下是一些帮助您入门的链接:

  1. 关于EDL支持的MPlayer手册

  2. MPlayer EDL教程

  3. 从命令行 LinuxGazette进行视频编辑

  4. 明智的电影项目

如果您不介意视频之间的小停顿,则可以通过每次使用具有不同EDL文件的脚本运行mplayer几次。如果不能停顿,那么也许您应该像varrtto建议的那样创建一个新视频。


但是,感谢使用命令行,我认为使用mplayers -ss和-endpos +我的emacs宏是更好的方法(请参阅我对原始文章的补充)。我真正想要的是一个不错的GUI。
学生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.