NMM视频技术(旧)

 找回密码
 成为会员
搜索
查看: 13718|回复: 21

[AVS插件] AVS脚本能读取到视频播放时间

  [复制链接]
发表于 2010-6-5 23:57 | 显示全部楼层
本帖最后由 辉耀 于 2010-6-6 00:01 编辑

1.
DSS("input.mkv").Trim(0,13579),直接喂给MeGUI Audio Input(误)

2.
拆出完整音轨,MeGUI Audio Cutter读进去,读入clt文件(格式参考下面),选好输出路径~OK(MeGUI根目录需要BeSplit.exe)


<?xml version="1.0"?>
<Cuts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Framerate>29.97002997002997002997002997003</Framerate>
<Style>FADE</Style>
<AllCuts>
   <CutSection>
     <startFrame>0</startFrame>
     <endFrame>13579</endFrame>
   </CutSection>
</AllCuts>
</Cuts>


话说,既然是访谈-动画-访谈,切换场景应该有IDR帧吧,那直接mmg切开源再一个个处理或许就行……


BeSplit.7z (14.25 KB, 下载次数: 22479)
 楼主| 发表于 2010-5-19 09:54 | 显示全部楼层 |阅读模式
本帖最后由 xueshan007050 于 2010-5-19 09:59 编辑

请教大家一个问题:

   能够用AVS脚本获取到视频的播放时间,精确到秒。
   通过AVS脚本或其他的方式、途径也可以的。
   
   用完美解码打开AVS脚本,然后看视频播放时间,这个我也会。
   能把时间输出到某个地方吗?比如某个txt文本里。

   本人也在努力的学习Avisynth,但是知识量有限,还是没能解决上面的问题。
   请教!
发表于 2010-5-19 14:16 | 显示全部楼层
在想要统计时间的AVS脚本最后加上如下代码,时间就会写入同目录下的time.log里面:
  1. time_seconds = last.FrameCount / last.FrameRate
  2. time_hour = floor(time_seconds / 3600)
  3. time_minute = floor((time_seconds - (time_hour * 3600)) / 60)
  4. time_second = floor(time_seconds - (time_hour * 3600) - (time_minute * 60))
  5. time_ms = floor(frac(time_seconds) * 1000)
  6. time_string = string(time_hour) + ":" + string(time_minute) + ":" + string(time_second) + "." + string(time_ms)
  7. WriteFileStart ("time.log", """time_string""", append=true)
复制代码
 楼主| 发表于 2010-5-21 10:35 | 显示全部楼层
回复 2# dgwxx 的帖子


    首先恭贺论坛又成熟了一步,升级了。昨天我还以为走错地了呢。

   谢谢dgwxx解答俺的问题。感激中。

   有几个问题请教:
    1.Avisynth上没有找到  视频属性中有这个last的。
       dgwxx从哪里了解到或学习到的呢?

    2.Avisynth的学习有什么指导意见吗?我指的是熟悉滤镜。
       总觉得了解的只是少了。


   dgwxx写的变量名很规范,一看就明白。
  是俺得学习的啊。


发表于 2010-5-21 13:17 | 显示全部楼层
1.AVS手册语法章节(AviSynth Syntax)第一句话中有last的说明:
In the first case, expression is evaluated and the result is assigned to variable_name. In the second case, expression is evaluated and the result, if a clip, is assigned to the special variable last.
NMM文档库中有中文条目,欢迎参考
AVS文档库提供AVS手册的中文翻译版(部分),欢迎使用。

2.我是一边用一边学很多年才学会的……所以如果只是像读教材一样读手册估计也记不住什么,所以一边用一边学估计效果会比较好。现在手册中文翻译比较少,最好能养成阅读英文文档的习惯。
 楼主| 发表于 2010-5-23 22:53 | 显示全部楼层
回复 4# dgwxx 的帖子


    谢谢。练习是最好的老师。
    有啥问题以后还要讨教。
  
   
发表于 2010-5-24 00:21 | 显示全部楼层
本帖最后由 lititude 于 2010-5-24 10:27 编辑

I think MediaInfo fits the requirement most.

AVS:
You need ffmpegsource2.
Function FFFormatTime is in FFMS2.avsi

  1. FFVideoSource("input.mkv")
  2. time_ms = FrameCount(last) / FrameRate(last) * 1000
  3. time_string = FFFormatTime(time_ms)
  4. WriteFileStart ("time.log", """time_string""", append=true)
复制代码
dgwxx told you the detail step by step.
发表于 2010-5-24 07:07 | 显示全部楼层
回复 6# lititude 的帖子
哦哦!还有如此便利的东西!
又学了一招~
发表于 2010-6-5 11:18 | 显示全部楼层
啊,小白在此回覆,問問一個問題:
一個視頻,3段,1,3是29.97,2是23.976,AVC+mkv,timecodev2轉成timecodev1后如下:
# timecode format v1
assume 23.976
0,13579,29.970
47908,93267,29.970
但是這是在我壓好后才發現v1的獲得方法的,我之前壓成的成品,avs裏面的幀和這個不對應。
而我打算用cue來切和轉換音頻(請問準確的切割方法么?)
那麼請問如何看到,如上的特定的幀的實際播放時間呢?
发表于 2010-6-5 11:59 | 显示全部楼层
没太看懂你的问题……
只要你没删帧加帧,再封装一遍不就行了么。
发表于 2010-6-5 14:34 | 显示全部楼层
我也没太看懂到底在问什么?
24fps那是做IVTC了吧,IVTC会砍重复帧,后面帧段的TC和AVS里Trim的当然不一样
其余的吐槽同LS
发表于 2010-6-5 17:44 | 显示全部楼层
本帖最后由 angering 于 2010-6-5 18:03 编辑

抱歉,抱歉,沒有說明白,其實是這樣子的:
一個2小時的視頻,分三部份:1.真人訪談。2.動畫 3.真人訪談
29.97的部份是由第一,第三組成
23.976則是第二部份
我壓成了3部份1.mkv(360p) 2.mkv(720p) 3.mkv(360p)
都是assumefps(30000,1001)
但是把1和2部份,2和3部份分開的幀數(就是我在vd下自己判斷切換動畫/訪談的 幀數 )和
由我從源視頻用mkvextract 得來的timecodev1 裏面的動畫/訪談 切換 幀數不對應
這是一個問題(其實這個應該不重要了吧?反正壓出來的要封裝timecode的吧?囧rz,最近腦子有點懵。見諒了)
第二個問題是,我想知道按照我自己的avs裏面的幀數對應的  那張 幀 對應的確切時間,好切音頻,
成品是3個mkv對應時間段的音頻~

我的avs
大概是
trim(0,2000)
trim(2001,3000)
trim(3001,4000)
而timecodev1得到的是
assumefps 23.976
0,2020,29.97
3030,4000,29.97
而我現在想得到 源視頻的 第2001幀的時間和第3001幀對應的音頻時間

源視頻是FLAC,我想利用cue或者其他更好的方式(聽說有切音頻的avs腳本,求詳細~)利用foobar或者其他工具轉成AAC或者MP4封裝的AAC

廢話多了……抱歉,抱歉~
发表于 2010-6-5 18:23 | 显示全部楼层
求帧号为n的帧实际播放时的时间
(n+1)/29.97   (n<=13579)
(13579+1)/29.97+(n-13579)/23.976   (13579<=n<=47908)
(13579+1)/29.97+(47908-13579)/23.976+(n-47908)/29.97   (47908<=n<=93267)
例如,帧号40000(第40001帧)实际播放时间是25:55:096763

(8L您是问这个么?如果不是的话抱歉了……)

但是……算这个似乎没什么意义……VFR有问题的话直接重封一次把TC扔进去就同步了……音频不用动啊……
发表于 2010-6-5 20:45 | 显示全部楼层
不需要分段压啊,直接在AVS里分段处理后写timecode封装就行了。
您已经压了3个段落了,分辨率又不一样,没办法拼接了,只能重新压。
发表于 2010-6-5 22:42 | 显示全部楼层
本帖最后由 angering 于 2010-6-5 22:53 编辑

感謝各位回覆~~

感謝~從輝耀的回覆已經得到答案了~~其實我就是很囧究竟是多一幀算,還是直接算時間

我切音頻的時候,一般是從vdm讀取avs的,但是我試過如下,不能夠運行:
v1=video.trim(0,100).assumefps(30000,1001)
v2=video.trim(101,200).assumefps(24000,1001)
v3=video.trim(201,300).assumefps(30000,1001)
v4=v1+v2+v3
來讀取時間(以前聽說過roozhou大提及音頻的幀率,但是關於音頻的幀率這個更囧……毫無概念,一直以為音頻時間如果不做修改,是不變的……)

其實我就是想吧視頻分割成3部份,3個不同的視頻…… 所以我是不需要做VFR的,timecode只是用來還原原視頻的幀率(其實這個是qyq的魯魯修r2的vol.1的那個訪談部份,由於我對於特典什麽的不懂日文,所以不大願意留下來,一般特典就留個360p,動畫留下來。)囧rz

因為我想得到最終3個不同的視頻,因此需要切割音頻,但是對應幀數的音頻時間又不知道怎麼算……

呵呵~~那麼最後請問,用什麽方式能按幀切音頻呢?(popgo我發過帖子,回覆是轉WAV,用goldwave或者Adobe audition切……但是本人有點囧Adobe……

聽說有按幀切音頻的avs腳本,跪求啊~~~)

十分感謝各位了~
v
发表于 2010-6-6 00:03 | 显示全部楼层
flac->wav再去切多安逸...
发表于 2010-6-6 00:04 | 显示全部楼层
如果你不介意音頻重編碼的話
直接把avs扔進megui之類的東西就可以了

否則的話, 可以考慮besplit
发表于 2010-6-10 22:41 | 显示全部楼层
本帖最后由 cunhan 于 2010-6-10 22:44 编辑
回复  lititude 的帖子
哦哦!还有如此便利的东西!
又学了一招~
dgwxx 发表于 2010-5-24 07:07



同学习到。
我一直为数帧写timecode不出差错而烦恼。
然后,看到用avs写文件的方法后想到一个点子,就是在avs里写代码获取每个分段的帧数,并且凑成timecode格式直接写入文件。
这样1pass出来就有tc file了,2pass的时候再加上--tcfile-in大功告成,嘿嘿
发表于 2010-6-10 23:58 | 显示全部楼层
同学习到。
我一直为数帧写timecode不出差错而烦恼。
然后,看到用avs写文件的方法后想到一个点子, ...
cunhan 发表于 2010-6-10 22:41



这样1pass和2pass的timebase不一样= = 不能压的。

当然,可以在1pass写一个空的timecode让timebase一样。。
发表于 2010-6-11 15:13 | 显示全部楼层
今天开始做尝试,发现只要预览一下avs,writefile就会马上执行。
无需像tfm的1pass那样要完整跑一遍。
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

小黑屋|手机版|NMM视频技术

GMT+8, 2024-3-29 22:42 , Processed in 0.421201 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表