• 1291 阅读
  • 2 回复

AviSynth+VobSub 5秒钟挂字幕

视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)

AviSynth 是一件非常奇怪的事物。既可以说它十分难,也可以说他非常简单。不会用的人对她摸不着头脑,用过她的人则对她爱不释手。到底AviSynth十个什么样的东西?我们就拿avi挂字幕编辑的问题,来见识一下5秒钟完成为Avi原文件贴上字幕的功能吧。


很多人在为视频文件加挂字幕的处理上,采用了通过DirectShow + DVobSub 自动调用avi文件和同目录下的同名文件的方法。不过,坦白地说,这样的调用方法不但效率低速度慢,而且并不能保证在所有的系统或者任何情况下都能稳定。那么有没有更好的办法?这里有一个答案:AviSynth。


AviSynth是一种脚本话的视频处理工具。与常见的Win32程序不同,她完全没有GUI或者Consol界面,所有的操作全部取决于你用notepad的时候,键入的寥寥几个参数。其特点是效率高,速度快,接口和源代码开放,稳定。


首先,可以到 http://sourceforge.net/projects/avisynth2/ 下载安装最新版本的AviSynth。现在2.5.2中还包括一个ffvfw包,可以让你的系统把avs(AviSynth脚本文件)当成普通的视频文件打开甚至播放。


接着,可以到 http://sourceforge.net/projects/guliverkli/ 下载安装最新版本的VSFliter,并确认将包中VSFliter.dll复制到 %Windir%\System32 目录下,并运行了 regsvr32 VSFilter.dll 进行注册。


现在用Notepad建立一个空白的文本文件,并将之命名为 xxx.avs。


接下来在这个文本文件中键入这样3行文字:

-------------------

AVISource("C:\Video\BDTH-YFdrG.avi")

LoadPlugin("VSFilter.dll")

VobSub("C:\Video\BDTH-YFdrG.idx")

-------------------

现在随便你用什么软件,Tmpgenc、CCE或者是VD来打开这个avs文件,你都可以看 vobdub 已经准确地出现在视频文件之中。





当然,用文本字幕时,语句需要些许变化:

-------------------

AVISource("C:\Video\BDTH-YFdrG.avi")

LoadPlugin("VSFilter.dll")

TextSub("C:\Video\BDTH-YFdrG.srt")

-------------------

现在,文本字幕也会出现在视频图像中了。





那么,这简单的三行文字代表什么?第一行 AVISource() 命令软件将右侧括号中的文件当作avi标准文件来打开编辑;第二行 LoadPlugin 命令,要求AviSynth在处理时调入括号中的插件,本例中打开了VSFilter.dll插件,就可以令AviSynth支持vobsub字幕;第三行 VobSub() 或者 TextSub() 命令,则是Vobsub插件自定义的命令,可以将括号中的字幕文件加入视频汇总流,最终输出到任何打开avs文件视频编辑软件上。


神奇的 AviSynth 就是这样的简单。不过目前调入字幕时还没有使用到VobSUB()或者TextSub()命令中的高级部分,所有字幕的显示设定将依赖于Vobsub的默认设置。语种选择取决于idx文件中的 langidx: 指数。您也可以通过rundll32 VSFilter,DirectVobSub 可进入设定面板。

取自"http://shooter.cn/wiki/AviSynth%2BVobSub_5%E7%A7%92%E9%92%9F%E6%8C%82%E5%AD%97%E5%B9%95?variant=zh-cn"
小鱼的淘宝店铺-多多支持哇

Avisynth使用简介

视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)

DV和D8数字摄像录像机渐渐进入生活,关于DV文件的编辑应用的需求也越来越多。但是DV视频文件虽然也是AVI文件,但在PC上兼容性并不好。无论是type-1或是type-2的DV-AVI文件都常常不能正确被其他编辑软件识别,制作DivX有时也有困难。 在面对这种兼容性不佳的文件,Avisynth就可以排上用场。(注:Tmpgenc目前已能兼容大部分DV文件处理,Avisynth只是备用方法)

1.首先当然是安装Avisynth . 将安装包中的avisynth.dll复制到windows\system目录,而后双击install.reg,注册成功后重新启动就安装成功了。

2.用notepad编辑一个文本文件,并保存为.avs类型的文件名。编辑这个avs的文件内容为: DirectShowSource("dv_filename.avi") 如果有多个文件则用逗号间隔。(推荐使用W2k+NTFS5文件系统采集DV文件——无文件大小限制)

3.剩下的用其它软件(TMPGenc、NanDub、VirtualDub)调用这个avs文件就可以顺利的作进一步的编辑了。

当然,这里对Avisynth的应用只是Avisynth强大功能的九牛一毛而已。例如配合Premiere export plugin 可以轻松输出经过各种艺术处理剪辑的视频信息供其它软件使用;还有各种功能强大的滤镜功能,详细资料请参阅“附录三 Avisynth scripting language reference” 对于DV的音频分离,可以使用Premiere 6以上的版本:调入DV文件后右键点击音频工作区,选择“Save to wav...”即可。或者试用Tmpgenc的 [File] – [MPEG Tool…] – [De-Mutilmux] 功能。 Avisynth配合mpeg2dec和IVTC plug-in,也可以做MPEG2-d2v文件的处理,avs文件的范例如下:

-----------------------------------------------------------

LoadPlugin("C:\Program Files\gknot\MPEG2DEC.dll")

LoadPlugin("C:\PROGRAM files\dvd2svcd\InverseTelecine.DLL")

mpeg2source("D:\sandra\DVD2AVI Project file.d2v")

crop(13,4,699,466)

DoubleWeave

InverseTelecine(40,10,15)

BicubicResize(640,352,0,0.60)

-----------------------------------------------------------  
小鱼的淘宝店铺-多多支持哇

用C#修改Mp3文件属性

视频在线上传+队列转换FLV+水印+捉图+修复+获时+转3GP(API语言不限,开视频站必备!)
使用 WindowsAPICodePack 的方法来修改。
WindowsAPICodePack 在下面地址可以下载:
http://code.msdn.microsoft.com/WindowsAPICodePack

我下载的是 Windows API Code Pack 1.0.1  中的
WindowsAPICodePack.zip
source code, 6927K, uploaded Nov 19

这个是源文件, 下载后打开可以看到 WindowsAPICodePack.sln 文件, 用 Visual Studio 编译后,我们可以得到下面2个文件:
Microsoft.WindowsAPICodePack.dll
Microsoft.WindowsAPICodePack.Shell.dll

这就是我们项目中要引用的两个文件。

引用这两个文件后,再在项目中增加一个文件,内容如下(注意把namespace修改为你自己的):

代码 复制 - 运行

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.WindowsAPICodePack.Shell; 
using Microsoft.WindowsAPICodePack.Shell.PropertySystem; 
using System.Reflection; 
namespace _52PS_WpfApplication 
{ 
    public class MediaTags 
    { 
        #region Mp3文件属性 
        //// <summary> 
        /// 标题 
        /// </summary> 
        [MediaProperty("Title")] 
        public string Title { get; set; } 
        /// <summary> 
        /// 子标题 
        /// </summary> 
        [MediaProperty("Media.SubTitle")] 
        public string SubTitle { get; set; } 
        /// <summary> 
        /// 星级 
        /// </summary> 
        [MediaProperty("Rating")] 
        public uint? Rating { get; set; } 
        /// <summary> 
        /// 备注 
        /// </summary> 
        [MediaProperty("Comment")] 
        public string Comment { get; set; } 
        /// <summary> 
        /// 艺术家 
        /// </summary> 
        [MediaProperty("Author")] 
        public string Author { get; set; } 
        /// <summary> 
        /// 唱片集 
        /// </summary> 
        [MediaProperty("Music.AlbumTitle")] 
        public string AlbumTitle { get; set; } 
        /// <summary> 
        /// 唱片集艺术家 
        /// </summary> 
        [MediaProperty("Music.AlbumArtist")] 
        public string AlbumArtist { get; set; } 
        /// <summary> 
        /// 年 
        /// </summary> 
        [MediaProperty("Media.Year")] 
        public uint? Year { get; set; } 
        /// <summary> 
        /// 流派 
        /// </summary> 
        [MediaProperty("Music.Genre")] 
        public string Genre { get; set; } 
        /// <summary> 
        /// # 
        /// </summary> 
        [MediaProperty("Music.TrackNumber")] 
        public uint? TrackNumber { get; set; } 
        /// <summary> 
        /// 播放时间 
        /// </summary> 
        [MediaProperty("Media.Duration")] 
        public string Duration { get; private set; } 
        /// <summary> 
        /// 比特率 
        /// </summary> 
        [MediaProperty("Audio.EncodingBitrate")] 
        public string BitRate { get; private set; } 
        #endregion 
        public MediaTags(string mediaPath) 
        { 
            //var obj = ShellObject.FromParsingName(mp3Path);   //缩略图,只读 
            //obj.Thumbnail.Bitmap.Save(@"R:\2.jpg"); 
            Init(mediaPath); 
        } 
        void Init(string mediaPath) 
        { 
            using (var obj = ShellObject.FromParsingName(mediaPath)) 
            { 
                var mediaInfo = obj.Properties; 
                foreach (var properItem in this.GetType().GetProperties()) 
                { 
                    var mp3Att = properItem.GetCustomAttributes(typeof(MediaPropertyAttribute), false).FirstOrDefault(); 
                    var <SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=shell">shell</SPAN>Proper = mediaInfo.GetProperty("System." + mp3Att); 
                    var value = shellProper == null ? null : shellProper.ValueAsObject; 
                    if (value == null) 
                    { 
                        continue; 
                    } 
                    if (shellProper.ValueType == typeof(string[]))    //艺术家,流派等多值属性 
                    { 
                        properItem.SetValue(this, string.Join(";", value as string[]), null); 
                    } 
                    else if (properItem.PropertyType != shellProper.ValueType)    //一些只读属性,类型不是string,但作为string输出,避免转换 如播放时间,比特率等 
                    { 
                        properItem.SetValue(this, value == null ? "" : shellProper.FormatForDisplay(PropertyDescriptionFormat.Default), null); 
                    } 
                    else 
                    { 
                        properItem.SetValue(this, value, null); 
                    } 
                } 
            } 
        } 
        public void Commit(string mp3Path) 
        { 
            var old = new MediaTags(mp3Path); 
            using (var obj = ShellObject.FromParsingName(mp3Path)) 
            { 
                var mediaInfo = obj.Properties; 
                foreach (var proper in this.GetType().GetProperties()) 
                { 
                    var oldValue = proper.GetValue(old, null); 
                    var newValue = proper.GetValue(this, null); 
                    if (oldValue == null && newValue == null) 
                    { 
                        continue; 
                    } 
                    // 这里做了修改  郭红俊 20091202 
                       // 原先在旧值存在,新值没有给出时,会有空<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=%B6%D4%CF%F3">对象</SPAN>引用的bug 
                    //if (oldValue == null || !oldValue.Equals(newValue)) 
                    // 新的逻辑 新值存在时, 则替换旧值 
                    if ((newValue != null) && (newValue.ToString().Trim().Length > 0) && (newValue != oldValue)) 
                    { 
                        var mp3Att = proper.GetCustomAttributes(typeof(MediaPropertyAttribute), false).FirstOrDefault(); 
                        var shellProper = mediaInfo.GetProperty("System." + mp3Att); 
                        Console.WriteLine(mp3Att); 
                        if (newValue == null) newValue = string.Empty; 
                        SetPropertyValue(shellProper, newValue); 
                    } 
                } 
            } 
        } 
        #region SetPropertyValue 
        static void SetPropertyValue(IShellProperty prop, object value) 
        { 
            if (prop.ValueType == typeof(string[]))        //只读属性不会改变,故与实际类型不符的只有string[]这一种 
            { 
                string[] values = (value as string).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 
                (prop as ShellProperty<string[]>).Value = values; 
            } 
            if (prop.ValueType == typeof(string)) 
            { 
                (prop as ShellProperty<string>).Value = value as string; 
            } 
            else if (prop.ValueType == typeof(ushort?)) 
            { 
                (prop as ShellProperty<ushort?>).Value = value as ushort?; 
            } 
            else if (prop.ValueType == typeof(short?)) 
            { 
                (prop as ShellProperty<short?>).Value = value as short?; 
            } 
            else if (prop.ValueType == typeof(uint?)) 
            { 
                (prop as ShellProperty<uint?>).Value = value as uint?; 
            } 
            else if (prop.ValueType == typeof(int?)) 
            { 
                (prop as ShellProperty<int?>).Value = value as int?; 
            } 
            else if (prop.ValueType == typeof(ulong?)) 
            { 
                (prop as ShellProperty<ulong?>).Value = value as ulong?; 
            } 
            else if (prop.ValueType == typeof(long?)) 
            { 
                (prop as ShellProperty<long?>).Value = value as long?; 
            } 
            else if (prop.ValueType == typeof(DateTime?)) 
            { 
                (prop as ShellProperty<DateTime?>).Value = value as DateTime?; 
            } 
            else if (prop.ValueType == typeof(double?)) 
            { 
                (prop as ShellProperty<double?>).Value = value as double?; 
            } 
        } 
        #endregion 
        #region MediaPropertyAttribute 
        [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)] 
        sealed class MediaPropertyAttribute : Attribute 
        { 
            public string PropertyKey { get; private set; } 
            public MediaPropertyAttribute(string propertyKey) 
            { 
                this.PropertyKey = propertyKey; 
            } 
            public override string ToString() 
            { 
                return PropertyKey; 
            } 
        } 
        #endregion 
    } 
}


使用这个文件的一个简单范例如下:
这个范例修改程序运行时目录下指定规范名字mp3文件的标题属性,当然其他属性也是类似的。

代码 复制 - 运行

        private void btn_2_Click(object sender, RoutedEventArgs e) 
        { 
            MediaTags mt = new MediaTags(Environment.CurrentDirectory); 
            for (int i = 1; i <= 16; i++) 
            { 
                string fileName = string.Format("{0}\\童林传_{1:000}.mp3", Environment.CurrentDirectory, i); 
                mt.Title = string.Format("童林传 {0:000}",i); 
                mt.Author = "单田芳"; 
                mt.Commit(fileName); 
            } 
        }


来源:http://www.tech-q.cn/thread-2738-1-1.html
小鱼的淘宝店铺-多多支持哇