您的位置:首页 > 其它

vlc的应用之五:动态调用libvlc.dll的补充

2010-11-11 10:32 211 查看
<!--
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 32.0px; font: 16.0px 'Arial Narrow'; color: #2c2c2c}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 32.0px; font: 14.0px 'Arial Narrow'; color: #2c2c2c}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 32.0px; font: 16.0px 'Arial Narrow'; color: #789d20}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Verdana; background-color: #eeeeee}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Verdana; background-color: #eeeeee; min-height: 16.0px}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Verdana; color: #028000; background-color: #eeeeee}
p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 28.0px; font: 14.0px 'Arial Narrow'; color: #2c2c2c}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Verdana; color: #800000; background-color: #eeeeee}
p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 26.0px; font: 13.0px 'Arial Narrow'; color: #2c2c2c}
p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 26.0px; font: 14.0px 'Arial Narrow'; color: #789d20}
p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 28.0px; font: 14.0px 'Arial Narrow'; color: #2c2c2c; background-color: #4b0082; min-height: 16.0px}
p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 32.0px; font: 16.0px 'Arial Narrow'; color: #2c2c2c; min-height: 18.0px}
p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 32.0px; font: 14.0px 'Arial Narrow'; color: #789d20}
span.s1 {color: #2c2c2c}
span.s2 {color: #789d20}
span.s3 {color: #4700ff}
span.s4 {color: #000000}
span.s5 {color: #028000}
span.s6 {color: #800000}
span.s7 {font: 14.0px 'Arial Narrow'; color: #789d20}
-->
最近Jeremiah在增加以前播放器的功能的时候,被一个中文路径转码问题恶心了两天,最后终于让我给解决了。在这跟大家分享这个转码的解决方法,以及用视频本次存储的接口实现。

在看本篇日志之前,请先看我以前写的《vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll 》

补充一:libvlc_new(...)接口的中文路径转码处理

using System;

using System.Runtime.InteropServices;

namespace MyOwnPlayer

{

class Core

{

//coreHandle字段和属性

private CoreHandle coreHandle;

public CoreHandle CoreHandle

{

get { return coreHandle; }

}

//构造方法

public Core(string[] argv, ref ExceptionStruct ex)

{

byte[][] argvbytes = new byte[argv.Length][];

for (int i = 0; i < argv.Length; i++)

{

argvbytes[i] = Encoding.UTF8.GetBytes(argv[i]);

}

coreHandle = libvlc_new(argv.Length, ReturnIntPtr(argvbytes, argv.Length), ref ex);

}

//转换函数

private IntPtr ReturnIntPtr(byte[][] data, int length)

{

IntPtr[] dataIntPtrArr = new IntPtr[length];

for (int i = 0; i < length; i++)

{

dataIntPtrArr[i] = Marshal.AllocHGlobal(data[i].Length * sizeof(byte));

Marshal.Copy(data[i], 0, dataIntPtrArr[i], data[i].Length);

}

IntPtr dataIntPtr = Marshal.AllocHGlobal(length * Marshal.SizeOf(typeof(IntPtr)));

Marshal.Copy(dataIntPtrArr, 0, dataIntPtr, length);

return dataIntPtr;

}

//Dll动态导入

[DllImport("libvlc")]

private static extern CoreHandle libvlc_new(int argc, IntPtr argv, ref ExceptionStruct ex);

}

}

补充二:本地存储。

对libvlc_new的argv进行转码的主要目的就是为了进行本地存储,由于要将存储路径传入到argv中,所以要对中文的存储路径进行转码。下面的做法是将视频流默认存储为ts流,边播放边存储。

//avPath是本地存储路径,需要注意路径的\和/的问题。

argv = new string[] { "--sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=" + avPath + "}}" };

//其他的就跟上一篇博客一样了。

core = new Core(argv, ref ex);

media = new Media(core.CoreHandle, link, ref ex);

player = new MediaPlayer(media.MediaHandle, ref ex);

player.Play(ref ex);//一面播放一面存储

关于其他形式的argv,可以在vlc的存储里面获得。vlc -> 媒体 -> convert/save -> 转换/保存。根据选择不同的形式,在vlc界面的下半部分会有Generated stream output string。这个就是具体的argv。不过,请注意将:sout换成--sout。

参考网址:

1. http://rogerfd.cn/?p=189

写在这篇博客之后:

1. Jeremiah对vlc其实并不熟,我也不是vlc专家,视频服务器专家,呵呵,所以,有时候大家问我的问题,其实,我自己也很不明白,不能误导大家。但是我只要明白的,懂得的,都会毫不保留的跟大家交流。Jeremiah只是根据自己的业务需求来用vlc,当然,用vlc第一步就是要编译它。编译vlc花了我N多心血。其他的业务需求主要是借用vlc作一个自己的软解码器,播放网络H264流。所以,对vlc客户端的学习多一些,包括C#调用vlc接口,还有activex控件的相关内容。但是对vlc的服务器方面的应用掌握的不够多。Jeremiah略懂java,略懂C#,但是对C,C++,VC及控件等,非常不熟悉,所以,研习vlc代码,一直迟迟没有进行。

2. Jeremiah编译这几个版本的vlc,都是经过严格的测试,才发到博客上面的,而且,尽量的写的已经不能再详细的地步。所以,如果根据我的博客编译不成功,肯定是哪一步没有搞正确。如果每一步都搞正确了,最后还没有编译成功,我只能说RP到极点了。

3. 很多时候Google比Jeremiah好用许多。很多信息都会出现在官网的文档上。还有./configure -h和vlc -H这些命令也能提供很多资料,研习下这些资料,比Jeremiah直接告知,能学到更多的东西。

4. vlc研究群里面有N多高手,如果有问题得不到解决,去群里面忽悠忽悠吧。

5. vlc这个专题的文章,Jeremiah以后会继续发,但是由于本人能力有限,估计不会经常更新了。不过只要我学到了新的关于vlc的东西,我就会整理了发上来。也希望各位高手能能多多帮助我,多多提意见。

6. vlc的调用过程大体说一下,一般都是vlc界面或者activex或者自己写的程序->libvlc.dll->libcore.dll->plugins,所以,在进行相关调试的时候,这样的目录结构是不能变的,也就是libvlc.dll,libcore.dll,plugins目录是在一级目录下面,而不是一堆dll在一个目录下面。

7. 2009-03-11开通vlc中文论坛,地址为:http://bbs.dvbcn.com/vlc/

写得比较乱,先到此,以后想起什么,再补充。

本文出自 “海狗哥的流媒体空间” 博客,请务必保留此出处/article/4430505.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: