2011-05-31 9 views
11

से वीडियो बनाएं क्या स्टैक पर छवि स्रोत जोड़ने और इसे से कोई वीडियो बनाने का कोई आसान तरीका है?ImageSource

+0

यदि मैं इसे और अधिक बार उठा सकता हूं तो मैं चाहता हूं। यह ऐसा कुछ है जिसे मैं भी करने में सक्षम होना पसंद करूंगा। – Tim

उत्तर

1

आप एक उदाहरण के रूप

http://joshsmithonwpf.wordpress.com/2008/04/23/good-old-fashion-image-animations-in-wpf/

उपयोग कर सकते हैं। इसके बाद आप एक वीडियो कैप्चर प्रोग्राम जैसे स्नैगिट या माइक्रोसॉफ्ट एक्सप्रेशन एन्कोडर प्रो का उपयोग वीडियो

+0

त्वरित उत्तर के लिए धन्यवाद। हाँ, लेकिन मैं एक ऐसा असम्पीडित एवीआई या कुछ आउटपुट की तरह rahter होगा: डी – Anders

1

जोश स्मिथ का ब्लॉग यहां राज द्वारा इंगित किया गया है (http://joshsmithonwpf.wordpress.com/2008/04/23/good-old-fashion-image-animations-in-wpf/) WPF ऐप में किसी फ़ोल्डर से छवियों को दिखाने का एक अच्छा उदाहरण है।

इस बार काम कर रहा है आप Saveen रेड्डीज ब्लॉग पर देखने के वीडियो http://blogs.msdn.com/b/saveenr/archive/2008/09/22/wpf-xaml-saving-an-animation-as-an-avi-video-file.aspx

+0

हाँ, यह कोई समस्या नहीं है, मैं उनके दृष्टिकोण को समझता हूं। लेकिन छवियों से एक असम्पीडित एवीआई आदि बनाने के लिए एक एपीआई या कुछ होना चाहिए? धन्यवाद। – Anders

1

उपयोग कैसे बिटमैप्स से एक avi बनाने के लिए पर नमूना कोड के लिए इस पुस्तकालय avifilewrapper खोज करने के लिए एप्लिकेशन कन्वर्ट करने के लिए कर सकते हैं। यह article बताता है कि आप अपने दृश्यों को बिटमैप्स में कैसे प्रस्तुत कर सकते हैं। मुझे नहीं लगता कि इससे इससे भी आसान हो जाएगा।

1

चूंकि डब्ल्यूपीएफ में वीडियो एन्कोडिंग लाइब्रेरी शामिल नहीं है, इसलिए आपको एन्कोडिंग करने के लिए बाहरी पर दुबला होना होगा। This blog post वर्णन करता है कि आप ऐसा करने के लिए विंडोज मीडिया एन्कोडर का उपयोग कैसे कर सकते हैं। वैकल्पिक रूप से, आप अपने ऐप के साथ मेनकोडर की तरह कुछ बंडल कर सकते हैं और इसे एक बाहरी प्रक्रिया के रूप में शुरू कर सकते हैं जिसे आप अपने ऐप से नियंत्रित और मॉनीटर करते हैं।

8

मैंने पहले से ही ऐसी कक्षा की है। मुझे केवल अपनी "ImageInfo" सबमिट करना है जो एक सिस्टम है। ड्रॉइंग बिटमैप।

Public Function WpfBitmapSourceToBitmap(ByVal source As BitmapSource) As System.Drawing.Bitmap 
       If source Is Nothing Then Return Nothing 
       Dim bmp As New System.Drawing.Bitmap(source.PixelWidth, source.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb) 
       Dim data As System.Drawing.Imaging.BitmapData = bmp.LockBits(New System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.[WriteOnly], System.Drawing.Imaging.PixelFormat.Format32bppPArgb) 
       source.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride) 
       bmp.UnlockBits(data) 
       Return bmp 
      End Function 

तो मैं यह करने के लिए फ्रेम जोड़ सकते हैं और एक पूर्व-चयनित कोडेक (उदाहरण के लिए XVid MPEG4) के साथ एक AVI फ़ाइल के रूप में यह स्टोर करने के लिए

Public Class clsAviWriter 
    Inherits MAINInterface.TB.Imaging.Pia7.clsDspTemplate 


    Private cAvi As AviReaderWriter.AviFile.AviManager 
    Private AviStream As AviReaderWriter.AviFile.VideoStream 
    Private AudioStream As AviReaderWriter.AviFile.AudioStream 


    Private cFps As clsTbQueue 
    Private OldFpsDate As Date = Now 




    ''' <summary> 
    ''' The image object to paint graphical objects on it 
    ''' </summary> 
    ''' <value>descriptor of the image</value> 
    Public Overrides Property ImageInfo() As MAINInterface.TB.Imaging.Pia7.clsImageInfo 
     Get 
      Return Me._ImageInfo 
     End Get 
     Set(ByVal value As MAINInterface.TB.Imaging.Pia7.clsImageInfo) 
      Me._ImageInfo = value 
      Call WriteFrame() 
      Call Me.OnPropertyChanged(Me.Guid) 
     End Set 
    End Property 

    Private Sub WriteFrame() 
     Dim D As Date = Now 
     Dim Fps As Single 


     Me.cFps.Values.Add(D.Subtract(Me.OldFpsDate).Ticks) 
     Me.OldFpsDate = D 

     Me.cFps.Trim() 

     Fps = 1000/New TimeSpan(Me.cFps.Average).TotalMilliseconds 
     Me.cFps.BufferSize = TB.Math.myTrim(Fps * 1, 1, 1000) 


     If Me.AviStream IsNot Nothing Then 
      Me.AviStream.AddFrame(Me._ImageInfo.Image.Clone) 
     End If 
    End Sub 

    Public Sub New() 
     Me.ClassDescription = "Write images into an avi file" 
     Me.cFps = New clsTbQueue(10) 
    End Sub 



    Private Sub InitializeAvi() 
     Dim W As String 
     Dim Fps As Single 
     Dim di As New IO.DirectoryInfo(TB.SystemMain.AppPath & "Avi\") 
     TB.FileSystem.CreateDirectories(di) 

     W = IO.Path.Combine(di.FullName, "Record_" & Now.Ticks.ToString("0") & ".avi") 

     Me.cAvi = New AviReaderWriter.AviFile.AviManager(W, False) 

     Dim Opts As New AviReaderWriter.AviFile.Avi.AVICOMPRESSOPTIONS 
     Opts.fccType = 0 
     Opts.fccHandler = 1684633208 
     Opts.dwKeyFrameEvery = 0 
     Opts.dwQuality = 0 '0 ... 10000 
     Opts.dwFlags = 8 'AVICOMRPESSF_KEYFRAMES = 4 
     Opts.dwBytesPerSecond = 0 
     Opts.lpFormat = 0 
     Opts.lpParms = New IntPtr(0) 
     Opts.cbParms = 3532 
     Opts.dwInterleaveEvery = 0 


     Fps = 1000/New TimeSpan(Me.cFps.Average).TotalMilliseconds 

     'Dim bm1 As Bitmap 
     'bm1 = TB.Imaging.CreateReScaledImage(Me.pic.Image, New Size(Me.pic.Image.Width, Me.pic.Image.Height), False) 
     Me.AviStream = cAvi.AddVideoStream(Opts, Math.Floor(TB.Math.myTrim(Fps, 1, 50)), Me._ImageInfo.Image.Clone) 

    End Sub 


    Public Overrides Property Run() As Boolean 
     Get 
      Return Me._Run 
     End Get 
     Set(ByVal value As Boolean) 
      If Me._Run <> value Then 
       Me._Run = value 
       If Me._Run = True Then 
        Call InitializeAvi() 
       Else 
        If Me.cAvi IsNot Nothing Then 
         Me.cAvi.Close() 
         Me.cAvi = Nothing 
         Me.AviStream = Nothing 
        End If 
       End If 
       Call Me.OnPropertyChanged(Me.Guid) 
      End If 
     End Set 
    End Property 


End Class 
एक AviClass किया: यह निम्नलिखित कोड का उपयोग करके आसान बनाया जा सकता है

अधिक कोड के लिए यहाँ देखो: http://www.wischik.com/lu/programmer/avi_utils.html और MSDN या http://www.codeproject.com/KB/audio-video/avigenerator.aspx

मैं sourcecode दिखाने के लिए पोस्ट किया है कि कैसे इस तरह के एक दृश्य की तरह दिखता है (कोड ऊपर कुछ और संदर्भ जो जनता के लिए उपलब्ध नहीं हैं की जरूरत है) कर सकते हैं। आप देख सकते हैं कि आपको केवल आरंभ करने, फ्रेम जोड़ने, एफपीएस मान स्टोर करने और हार्डडिस्क में सुरक्षित करने की आवश्यकता है।

यदि चाहें तो भी, आप डायरेक्टशो की खोज कर सकते हैं यह देखने के लिए कि सभी कैसे काम करते हैं। DirectShow Pins

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^