搜索 社区服务 统计排行 帮助
  • 1046阅读
  • 12回复

[请教]可以读出媒体文件持续时间的API[再请教weilai兄]

楼层直达
级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
以前曾经用过AVIFileInfo这个api查出avi文件的播放持续时间,但像ogm\mkv\mpeg……这些格式就无法了,有没有api能实现只要是Windows Media Player能播放的格式,它就能读取出播放持续时间?

当然不一定只是api,如果在vb中能通过[引用]实现的也行!
麻烦各位了^^

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 1楼 发表于: 2005-05-20
^^
這就以 DirectShow 涵式最適合擔當了 (幾乎全部都吃 rm/rmvb/wmv... 只要是用 DirectShow Graph 播放的媒體都可以)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/durationpropertyimediapositionobject.asp

首先要創建媒體
Public m_objFilgraphManager As FilgraphManager '媒體控制對像;As QuartzTypeLib.FilgraphManager
Public m_objMediaPosition As IMediaPosition '媒體位置對像;

初始媒體物件
Set m_objFilgraphManager = New FilgraphManager
Set m_objMediaPosition = m_objFilgraphManager
...
m_objFilgraphManager.RenderFile m_strFileName '開啟並演算建構DirectShow Graph

m_objMediaPosition.Duration '播放的流媒體的持續時間,單位為秒
就是您要的

用玩之後不要忘了釋放該資源
Set objFilgraphManager = Nothing
Set m_objMediaPosition = Nothing

雖然 VB 無法像 VC 一樣隨心所欲
但也很好用了
以上缺點就是 RenderFile 可能會有停頓現象
可以在之後加個
DoEvents
改善
另外...(忘了要說什麼 ^^||)

(這一段落也可從個人的 KalaOK 專案找到,說來慚愧遇到瓶頸就擱置...^^||)

级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 2楼 发表于: 2005-05-20
多谢weilai兄!本想发信息问你的,不过想着发帖可以发动群众力量,也可以让有需要的人看到^_^

我也想过查看 KalaOK 的代码,不过代码比较多,直接发问快点。

还有一件事想麻烦weilai兄,以前我看过一篇用vb做繁体、简体文字转换的文章,不过现在掉失了,找不着,兄才手里有吗?

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 3楼 发表于: 2005-05-20
首先
想起來是忘了什麼
要使用 FilgraphManager 需要在 選單(菜單)的專案->設定引用項目 導入 quartz.dll



vb做繁体、简体文字转换的文章
手上是沒有耶
不過請看 (基本來是會利用到 StrConv)
http://www.google.com.tw/url?sa=U&start=3&q=http://study.99net.net/study/program/vb/1049956940.html&e=10313

http://www.google.com.tw/search?hl=zh-TW&q=VB+BIG5%E8%88%87GB%E8%BD%89%E6%8F%9B&btnG=%E6%90%9C%E5%B0%8B&meta=lr%3Dlang_zh-CN%7Clang_zh-TW

级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 4楼 发表于: 2005-05-20
感谢中^_^

又有事麻烦你了:发现用m_objFilgraphManager.RenderFile读入了媒体文件后,怎样关闭读入的媒体文件?表现在如果有外挂字幕,vobsub一直在任务栏,看了一下KalaOK的关闭方法,有点不了解。

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 5楼 发表于: 2005-05-20
??
我這裡試沒有這個現象耶 (無論是 wmv/rmvb/avi+字幕、mkv...,會不會是filter安裝的問題...)
您要自己除錯才能找到問題在哪

在APP裡先開 [avi]
按 VB 的 || 暫停鍵
接著按 F8
再回到APP裡 close [avi]
此時就可用 F8 一步步的觀察哪裡有問題

级别: 工作组
注册时间:
2003-08-26
在线时间:
13小时
发帖:
6600
只看该作者 6楼 发表于: 2005-05-20
问一句,有人试过用libiconv转换字符集么?

催片请点此处: http://bbs.popgo.org/bbs/read.php?tid=502402&displayMode=1#19103164
级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 7楼 发表于: 2005-05-20
weilai兄,我想问的是怎样在APP裡 close [avi],而不是说close [avi]后vobsub还在任务栏。

m_objFilgraphManager的事件只有stop之类,没有close

级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 8楼 发表于: 2005-05-20
终于明白了是
Public m_objFilgraphManager As FilgraphManager '媒體控制對像;As QuartzTypeLib.FilgraphManager
Public m_objMediaPosition As IMediaPosition '媒體位置對像;

Public搞的鬼,害得Set X = Nothing无效,改用dim就OK了

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 9楼 发表于: 2005-05-20
引用
最初由 MeteorRain 发布
问一句,有人试过用libiconv转换字符集么?

What ??
c 嗎?
用 google 搜 "libiconv轉" 可以找到您要的資料

引用
最初由 dio1888 发布
终于明白了是
Public m_objFilgraphManager As FilgraphManager '媒體控制對像;As QuartzTypeLib.FilgraphManager
Public m_objMediaPosition As IMediaPosition '媒體位置對像;
Public搞的鬼,害得Set X = Nothing无效,改用dim就OK了


因為我是寫在 .bas 裡...
其實覺得開太慢也可技巧性避開一些filter連結 (只是個想法沒試過...)

级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 10楼 发表于: 2005-05-21
关于FilgraphManager的问题,发现如果查avs播放持续时间,会导致程序崩溃的,提示:
系统错误&H800401F0(-2147221008),尚未调用CoInitialize。

PS:weilai兄,我回了短信。

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 11楼 发表于: 2005-05-21
avs 個人到沒去想過
試試
m_objFilgraphManager.Stop
再釋放 m_objFilgraphManager
Set m_objFilgraphManager = Nothing

可能是AVS內部用到 DirectShow Graph
又AVS被 VB 所使用...

不過程序一關閉就會錯誤...
又 .avs 內容有誤也會終結 VB程序...

目前還要找找資料...
(可能要自己斷開 AVS Pin 連結,方法...)
(如果 .avs 內沒用到 trim,可以對 .avs 搜尋 AVISource或Direct...等 Source filter,再將 "" 內媒體檔拿出來使用 ※這是目前的簡便方法)

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 12楼 发表于: 2005-05-22
找到一個 avs 方法
c=AVISource("120fps.avi").changefps(30)
WriteFile(c, "c:\Time_output.txt", string(c.Framecount/c.Framerate))
trim(0,1) #這樣會出現兩行一樣的 Framecount/Framerate 值

這樣就會生成一個 Time_output.txt
內容就是您要的
請自行就此基礎得到您要的東西...

快速回复

限150 字节
上一个 下一个