特别说明哦:我的日志都是自己写的,完全是自己写的,完全没有转载的,可别以为我是转载的哦
这里的文章除特别说明的以外,全部使用《知识共享 署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议》进行许可,不可以盗用哦

Linux下使用被动模式调用MPlayer

| |
[夜晚 2009年1月11日 19:22 | by gs ]

[b]首先说明,虽然我已经成功地做到了调用MPlayer并给它发送命令然后读取结果,但是具体的过程细节到底是怎样的我还不是很清楚。同样是因为这样的原因,我在文中的叙述可能有技术上的错误,欢迎指正

[/b]

popen()函数用于打开一个进程,返回结果是一个FILE*类型,这个返回值根据打开方式的不同,分别指向使用popen()打开的程序的输入流或输出流,可以直接当成一个普通文件来使用。

popen()的第一个函数是命令行,就是要执行的程序的命令,第二个参数可以是"r“或"w",这和fopen是差不多的,一个是读取,这时候返回结果可以当成打开的进程的输出流,另一个w就是输入,返回结果可以当成打开进程的输入流

popen()函数实际上是一个封装好的用于进程间管道通信的函数,可惜的是它的第二个参数不能是"rw",只能是r或w。因为我们要从MPlayer的输出流读取返回的信息,所以这里要使用"r“参数。

这样我们就不能直接从标准输入给MPlayer输入指令了。不过没关系,MPlayer提供了被动模式,可以从一个FIFO文件中给MPlayer输入指令。只要在调用MPlayer的时候使用 -slave -input file=path 参数就可以了

因为 -input file=path 里面的path是一个FIFO文件,所以我们必须先创建一个这样的管道。使用unlink()和mkfifo()函数就可以做到。这里我们使用/tmp/cmd作为FIFO文件,代码如下

之后就可以使用popen()来打开MPlayer了,代码如下

其中的-quiet参数是让MPlayer以静默模式运行,不要输出太多的信息,这样方便我们获取输入指令后返回的结果

MPlayer提供了一些指令,利用这些指令我们可以得到当前播放的信息和控制播放器,这些指令可以在终端中输入下面的指令查看

[code]

mplayer -input cmdlist

[/code]

接下来就应该给MPlayer输入指令了。刚才已经使用mkfifo建立了管道,现在我们就把指令输入到这个管道里面,这样MPlayer就能收到指令,并输入结果了。结果我们可以在mp这个变量中通过普通的文件操作来读取出来。

在终端中输入 echo command > /tmp/cmd ,这样就可以将command写入/tmp/cmd这个FIFO文件。我们要在程序中进行写入,可以使用system()函数。现在我想给MPlayer发送一个get_time_pos指令,这个指令可以获取当前影片的播放时间,代码如下

这样指令就发送给MPlayer了,之后我们就可以从通过mp变量这个文件指针读出MPlayer的返回信息。因为MPlayer可能返回其他不相关的播放信息,我们要精确获取get_time_pos指令返回的结果,所以不能直接就把mp中的内容读取出来,这里需要做一些判断。在终端中调用MPlayer以后试着输入get_time_pos指令,可以看到返回的结果是 ANS_TIME_POSITION=%f 这样的形式,于是代码就可以这样写

这样就完成了被动调用MPlayer,并给MPlayer发送指令然后读取信息。

实际上这就是我正在开发的字幕软件ytsub所用的方法。

最后完整的代码如下,这段代码很简单,只实现了使用被动模式调用MPlayer,然后输出当前的播放时间。头文件我忘记要包含哪些了,这里就省略了。

好吧我连main()都省略了……好孩子别学我这样子



请给这篇日志评个分吧!
  • Currently 1.33/9
  • 1
    -4
  • 2
    -3
  • 3
    -2
  • 4
    -1
  • 5
    0
  • 6
    1
  • 7
    2
  • 8
    3
  • 9
    4

现在的分数: 1.3 分,共3个评分

Tags: ,
乱七八糟 » 零零散散 | 评论(3) | 引用(0) | 阅读(1175)
dwc
2009年7月27日 15:20

文章不错   但是我按你的搞法好像不能得到正确的东西类

可以指点一下我不咯!  

          我现在正在弄这个啦!

                            谢谢啦!

      我的qq573621032

gs 回复于 2009年7月28日 17:22

文中代码有误:

# unlink("/tmp/cmd");  

# mkfifo("/tmp/cmd", 0777);  

之前写的是

# unlink("/tmp/cmd");  

# mkfifo("/cmd/tmp", 0777);  

现在已经改过来了

HE119
2009年4月10日 19:40

不意思,可能是我的浏览器不好,今天再点进来的时候,终于可以看完你的文章了!

HE119
2009年4月2日 14:32

老兄你的文章很好,可是有一半是给庶住的!看不了!

gs 回复于 2009年4月3日 23:44

你说的遮住是指哪里?如果是网页排版问题的话可以试试使用其他浏览器,这个皮肤的浏览器兼容性是不太好

分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               
请不要填写这个空,这个空是一个垃圾广告陷阱,如果你填写了这个空,你的留言将无法发表
请在下面的文本框填写评论内容

验证码 不区分大小写