2017-05-16 67 views
1

我正在使用Microsoft编码器来分割视频。这是从微软网站的例子:将分割视频保存到数据库并检索它们

MediaItem item = new MediaItem(@"C:\myvideo.wmv"); 
item.SourceClips[0].EndTime = new TimeSpan(0, 0, 15); 

TimeSpan timeStart = new TimeSpan(0, 0, 30); 
TimeSpan timeEnd = new TimeSpan(0, 0, 45); 
item.SourceClips.Add(new SourceClip(timeStart, timeEnd)); 

有没有一种方法,我可以节省分裂视频的到数据库?是否有可能从数据库中获取分割视频到客户端?

来源:https://blogs.msdn.microsoft.com/deanro/2009/03/16/editing-files-with-encoder/

亲切的问候

回答

2

有两种方法来实现这一目标。

  1. 您上传的视频文件直接到您的DB(你需要在你的数据库的视频表中的BLOB场)
  2. 您保存在文件系统中的视频文件和路径的文件存储在数据库中(首选)。

为什么我更喜欢第二种方法?
数据库旨在非常快速地处理小物体。另一方面,数据库内的较大对象随着时间的推移而降低,访问速度受到影响。第二种方法也比较简单,但我们先来看看。

编码:

private void Encode() 
{ 
    Job j = new Job(); 
    MediaItem m = new MediaItem(txtBxVideoFilePath.Text); 
    Source s = m.Sources[0]; 
    s.Clips[0].StartTime = new TimeSpan(0, 0, 5); 
    s.Clips[0].EndTime = new TimeSpan(0, 0, 10); 
    j.OutputDirectory= @"C:\Users\MyOutputDir\"; 
    j.MediaItems.Add(m); 
    j.Encode(); 
    txtBxOutputDir.Text = j.ActualOutputDirectory; //Path to your videofile 
} 

编码后,你会得到你的JobActualOutputDirectory您可以访问,然后让你的编码的视频文件,或者将它们保存在其他地方(第二种方法的目录串)或将它们保存为您的数据库中的BLOB

存储为(LONG)BLOB(在我的情况下,我用MySQL作为我的DBMS,但其他DBMS应该不会太不同):

创建表:

CREATE TABLE `video` (
    `VideoID` int(11) NOT NULL, 
    `VideoName` varchar(255) NOT NULL, 
    `VideoSize` int(11) NOT NULL, 
    `VideoFile` longblob NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

当然还有很多缺如索引,主键,但与获得整体想法无关。

要将文件存储在您的数据库中,您必须将其读取为BLOB兼容对象,该对象是一个字节数组(byte[])。

byte[] video = File.ReadAllBytes(filepath); 

您可以通过迭代得到的文件路径ActualOutputDirectory

foreach (string filepath in Directory.GetFiles(ActualOutputDirectory)) 
{ 
    StoreBLOBInDB(filepath); 
} 

将您的视频文件转换成数据库的代码可能是这样的:

MySqlCommand command = new MySqlCommand("", connection); 
command.CommandText = "INSERT INTO video (VideoName, VideoSize, VideoFile) VALUES (?videoname, ?videosize, ?videofile);"; 

byte[] video = File.ReadAllBytes(filepath); 

MySqlParameter pVideoName= new MySqlParameter("?videoname", MySqlDbType.VarChar); 
pVideoName.Value = Path.GetFileName(filepath); 
MySqlParameter pVideoSize = new MySqlParameter("?videosize", MySqlDbType.Int32); 
pVideoSize.Value = video.Length; 
MySqlParameter pVideoBlob= new MySqlParameter("?videofile", MySqlDbType.Blob, video.Length); 
pVideoBlob.Value = video; 

command.Parameters.Add(pVideoName); 
command.Parameters.Add(pVideoSize); 
command.Parameters.Add(pVideoBlob); 
command.ExecuteNonQuery(); 

打开/关闭的连接:

string myConnectionString = "SERVER=localhost;" + 
         "DATABASE=encodingdb;" + 
         "UID=encoder;" + 
         "PASSWORD=encoder;"; 
this.connection = new MySqlConnection(myConnectionString); 
this.connection.Open(); 

this.connection.Close(); 

检索BLOB文件也很容易:

MySqlCommand command = new MySqlCommand("", connection); 
command.CommandText = "SELECT VideoName, VideoSize, VideoFile FROM video WHERE VideoName=?videoname;"; 
MySqlParameter pVideoname = new MySqlParameter("?videoname", MySqlDbType.VarChar); 
pVideoname.Value = Path.GetFileName(videoName); 
command.Parameters.Add(pVideoname); 
MySqlDataReader videofileReader; 
videofileReader = command.ExecuteReader(); 
byte[] videoBlob = new byte[0]; 
while (videofileReader.Read()) 
{ 
    int videoSize = videofileReader.GetInt32("VideoSize"); 
    videoBlob = new byte[videoSize]; 
    videofileReader.GetBytes(videofileReader.GetOrdinal("VideoFile"), 0, videoBlob, 0, videoSize); 
} 
File.WriteAllBytes(@"C:\Encoding\export.wmv", videoBlob); 
videofileReader.Close(); 
CloseConnection(); 
+0

谢谢你的时间!这正是我想要的,祝你有美好的一天。 – Fearcoder

+0

不客气,祝你有美好的一天。快乐编码:-) – jAC

+0

在MSSQL中,您可以使用FileStreams来保存Blob数据。通过将文件系统上的varbinary(max)二进制大对象(BLOB)数据存储为文件,FILESTREAM将SQL Server数据库引擎与NTFS文件系统集成在一起。在这里查看更多详情https://technet.microsoft.com/zh-cn/library/bb933993(v=sql.105).aspx –

相关问题