Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Avifil32.dll tekee vain neliön muotoisia videoita

Hennkka [08.06.2011 20:18:25]

#

Olen yrittänyt tehdä ruudunkaappausohjelmaa ja saankin kuvia ruudulta. Nyt pitäisi saada kuvat videoon. Olen yrittänyt tehdä videota tämän avulla siinä kuitenkaan onnistumatta. Minulla ei ole käyttäjää tuonne, joten en voi ladata lähdekoodia ja muutenkin käsin kopiointi opettaa enemmän :) Oma koodini (suora kopio tuosta vähän karsittuna) ei osaa tallentaa muita kuin neiliön muotoisia kuvia. Mistähän se johtuu? Tässä koodin kohta, jossa virhe tapahtuu:

Public Sub AddFrame(ByVal bmp As Bitmap)
    bmp.RotateFlip(RotateFlipType.RotateNoneFlipY)
    Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat)

    'Tämä toimii:
    'Dim tmp As Byte() = New Byte(bmpData.Stride * bmpData.Height - 1) {}
    'Marshal.Copy(bmpData.Scan0, tmp, 0, bmpData.Stride * bmpData.Height)

    Dim result As Integer = Avi.AVIStreamWrite(CType(IIf(writeCompressed, compressedStream, StreamPointer), IntPtr), countFrames, 1, bmpData.Scan0, CInt((bmpData.Stride) * (bmpData.Height)), 0, 0, 0)    'Heittää virheen tässä

    If result <> 0 Then
        Throw New Exception("Exception in VideoStreamWrite: " + result.ToString())
    End If

    bmp.UnlockBits(bmpData)

    countFrames += 1
End Sub
AccessViolationException occured:
Yritettiin lukea tai kirjoittaa suojattua muistia. Tämä on usein merkki siitä, että toinen muisti on vioittunut.

neau33 [09.06.2011 03:43:34]

#

Moi Henkka!

Kääntelin ton sun Oma koodini-linkin takaa imppaamani viritelmän ja varoitteli, että: Funktio GetVideoStream ei palauta arvoa kaikissa koodipoluissa...

Nappasin sitten pakkaamatonta kokoruutua testi.avi filuun ja kun yritin sulkea formin designerissä niin AviStream.vb filun Close tapahtumassa, Avi.AVIStreamRelease(compressedStream) jutskassa heitteli, että: Yritettiin lukea tai kirjoittaa suojattua muistia...

Ratkaisuna moisiin virheilmoihin olen käyttänyt Microsoft.VisualStudio.OLE.Interop assemblyn IPersistStreamInit castausta malliin jotakuinkin tyyliin:

'...
Dim ips As IPersistStreamInit
ips = CType(ObjektiJoka*****ilee, IPersistStreamInit)
ips.InitNew()
'...

Hennkka [09.06.2011 08:22:31]

#

Itselläni ei heitä virhettä Closessa vaan tuossa kuvan tallentamisessa. Pakkaamattomia kokokuvia se suostuu tallentamaan, mutta wmp ei avaa videota. Käyttäisin muutenkin mielummin pakattua videota, mutta se heittää tuossa ylempänä mianitussa kohdassa virheen.

Edit. Pakkaamiseen yritän käyttää Microsoft Video 1
Edit2. Olisiko jollain valmista koodia, jolla pystyy tallentamaan videoita? Riittää ihan yhden funktion ratkaisu, josta voin väännellä sopivan :)

neau33 [09.06.2011 09:06:21]

#

Moi taas Henkka!

Täältä löytyis pikku avifilu wrapperi...

neau33 [13.06.2011 23:09:19]

#

Moi taas Henkka!


Halutessasi voit impata täältä tohon Corinna John'n Wrapperiin pohjautuvan toimivan screen recorder viritelmän.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta