In einem mp4 Video einen Text einblenden

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von jnpanzer.

    In einem mp4 Video einen Text einblenden

    Ich möchte in einem Video ein bzw. mehrere Texte einfügen.
    Ich nutze hierzu ffmpeg.

    Mit der Kommandozeile mit ffmpeg exe bekomme ich das hin.
    Ich möchte das aber gerne in VB.net machen mit Accord.

    Bei der Ausführung kommt die Meldung "Fehler BC30560 "VideoFileReader und FileWriter" ist im Namespace "Accord.Video.FFMPEG" mehrdeutig.".
    Ich hatte auch schon "Accord.Video.FFMPEG.VideoFileReader()" versucht.

    Kann mir jemand einen Tipp geben?

    VB.NET-Quellcode

    1. Imports Accord.Video.FFMPEG
    2. Imports System.Drawing
    3. Public Class frmVideo
    4. Private Sub btnAddText_Click(sender As Object, e As EventArgs) Handles btnAddText.Click
    5. Dim inputPath As String = "C:\logs\Digital.mp4"
    6. Dim outputPath As String = "C:\logs\Digital_out.mp4"
    7. Dim overlayText As String = "Neuer Preis"
    8. AddTextOverlay(inputPath, outputPath, overlayText)
    9. MessageBox.Show("Die Verarbeitung ist abgeschlossen.")
    10. End Sub
    11. Private Sub AddTextOverlay(inputPath As String, outputPath As String, overlayText As String)
    12. 'Fehler BC30560 "VideoFileReader" ist im Namespace "Accord.Video.FFMPEG" mehrdeutig.
    13. Using reader As New VideoFileReader()
    14. reader.Open(inputPath)
    15. 'Fehler BC30560 "VideoFileWriter" ist im Namespace "Accord.Video.FFMPEG" mehrdeutig.
    16. Using writer As New VideoFileWriter()
    17. writer.Open(outputPath, reader.Width, reader.Height, reader.FrameRate, reader.VideoCodec)
    18. Dim frameIndex As Integer = 0
    19. While True
    20. Dim frame As Bitmap = reader.ReadVideoFrame()
    21. If frame Is Nothing Then
    22. Exit While
    23. End If
    24. Using g As Graphics = Graphics.FromImage(frame)
    25. Using font As New Font("HelveticaNeueLT Std ExtBlk Cn", 27)
    26. Dim textSize As SizeF = g.MeasureString(overlayText, font)
    27. Dim x As Integer = 500
    28. Dim y As Integer = 700
    29. g.DrawString(overlayText, font, Brushes.White, x, y)
    30. End Using
    31. End Using
    32. writer.WriteVideoFrame(frame)
    33. frameIndex += 1
    34. End While
    35. writer.Close()
    36. End Using
    37. reader.Close()
    38. End Using
    39. End Sub
    40. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „jnpanzer“ ()

    Wenn Du zu viele Namespaces importierst, kann es sein, dass es gleichnamige Klassen in verschiedenen Namespaces gibt. Wenn also im importierten Namespace N1 eine Klasse Kx existiert und eine Klasse Kx im Namespace N2 und Du nur schreibst Dim X As New Kx, dann weiß der Compiler nicht, welches Kx Du meinst. Gib den Namespace mit an, dann wird es dem Compiler klar. Schreib also z.B.: Dim X As New N1.Kx
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed
    Danke für deiuenn Tipp

    Das hatte ich auch schon verucht. Hatte mir google vorgeschlagen
    Leider mit den gleichen Ergebnis.

    Mit "Accord.Video.FFMPEG.VideoFileReader()".


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Accord.Video.FFMPEG
    3. Imports System.Drawing
    4. Public Class frmVideo
    5. Private Sub btnAddText_Click(sender As Object, e As EventArgs) Handles btnAddText.Click
    6. Dim inputPath As String = "C:\logs\Digital.mp4"
    7. Dim outputPath As String = "C:\logs\Digital_out.mp4"
    8. Dim overlayText As String = "Neuer Preis"
    9. AddTextOverlay(inputPath, outputPath, overlayText)
    10. MessageBox.Show("Die Verarbeitung ist fertig.")
    11. End Sub
    12. Private Sub AddTextOverlay(inputPath As String, outputPath As String, overlayText As String)
    13. 'Leider kommt der Fehler
    14. 'Fehler BC30560 "VideoFileReader" ist im Namespace "Accord.Video.FFMPEG" mehrdeutig.
    15. Using reader As New Accord.Video.FFMPEG.VideoFileReader()
    16. reader.Open(inputPath)
    17. 'Leider kommt der Fehler
    18. 'Fehler BC30560 "VideoFileWriter" ist im Namespace "Accord.Video.FFMPEG" mehrdeutig.
    19. Using writer As New Accord.Video.FFMPEG.VideoFileWriter()
    20. writer.Open(outputPath, reader.Width, reader.Height, reader.FrameRate, reader.VideoCodec)
    21. Dim frameIndex As Integer = 0
    22. While True
    23. Dim frame As Bitmap = reader.ReadVideoFrame()
    24. If frame Is Nothing Then
    25. Exit While
    26. End If
    27. Using g As Graphics = Graphics.FromImage(frame)
    28. Using font As New Font("HelveticaNeueLT Std ExtBlk Cn", 27)
    29. Dim textSize As SizeF = g.MeasureString(overlayText, font)
    30. Dim x As Integer = 500
    31. Dim y As Integer = 700
    32. g.DrawString(overlayText, font, Brushes.White, x, y)
    33. End Using
    34. End Using
    35. writer.WriteVideoFrame(frame)
    36. frameIndex += 1
    37. End While
    38. writer.Close()
    39. End Using
    40. reader.Close()
    41. End Using
    42. End Sub
    43. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „jnpanzer“ ()

    Klingt so, als ob Du doppelte DLLs eingebunden hast, vielleicht einmal direkt von Accord und eine, die Accord nutzt. Woer hast Du Accord? nuget? Oder welche andere Quelle?
    Wenn Du über nuget bezogen hast, stell sicher, dass Du nur ein Paket verwendest, also nicht Accord und dann noch Accord.Video.FFMPEG oder sowas doppeltes.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für deienn Tipp.
    Ich habe da ein wenig zu viel importiert ...
    Hab es komplett neu gemacht ..

    Gab noch einige andere Probleme... aber es läuft jetzt :)

    Anbei er Lauffähiger Code

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Accord.Video
    3. Imports Accord.Video.FFMPEG
    4. Imports System.Drawing
    5. Public Class Form1
    6. Private Sub btnAddText_Click(sender As Object, e As EventArgs) Handles btnAddText.Click
    7. Dim inputPath As String = "C:\logs\Digital.mp4"
    8. Dim outputPath As String = "C:\logs\Digital_out2.mp4"
    9. Dim overlayText As String = "Hier ist der Text"
    10. AddTextOverlay(inputPath, outputPath, overlayText)
    11. MessageBox.Show("Die Verarbeitung ist abgeschlossen.")
    12. End Sub
    13. Private Sub AddTextOverlay(inputPath As String, outputPath As String, overlayText As String)
    14. Dim reader As New VideoFileReader()
    15. reader.Open(inputPath)
    16. Dim writer As New VideoFileWriter()
    17. writer.Open(outputPath, reader.Width, reader.Height, reader.FrameRate, VideoCodec.MPEG4)
    18. Dim font As New Font("Arial", 24)
    19. Dim brush As New SolidBrush(Color.White)
    20. Dim x As Integer = 100
    21. Dim y As Integer = 102
    22. Dim frameIndex As Integer = 0
    23. While True
    24. Dim frame As Bitmap = reader.ReadVideoFrame()
    25. If frame Is Nothing Then
    26. Exit While
    27. End If
    28. Using g As Graphics = Graphics.FromImage(frame)
    29. g.DrawString(overlayText, font, brush, x, y)
    30. End Using
    31. writer.WriteVideoFrame(frame)
    32. frameIndex += 1
    33. frame.Dispose()
    34. End While
    35. writer.Close()
    36. reader.Close()
    37. End Sub
    38. End Class