Laden...

Forenbeiträge von Richard95 Ingesamt 10 Beiträge

15.12.2016 - 09:08 Uhr

verwendetes Datenbanksystem: <DataTable>

Hallo,

Ich habe einen DataTable mit 4 Spalten und n Zeilen. In der ersten Spalten habe ich nur Integer (Int64). Diese Spalte repräsentiert einen Zeitstempel.

Das heißt konkret, dass ich die Werte der ersten Spalte von Int64 in DateTime umwandeln möchte. Die Zeit soll folgendes Format haben: yyyy-MM-ddTHH:mm:ss.fffffff

Wie kann ich die erste Spalte durchlaufen und dabei alle Werte in das gewünschte Format umwandeln?

Bisheriger Ansatz:


                DataTable dataTable_Temp2 = dataTable_Temp.Clone();
                dataTable_Temp2.Columns[0].DataType = typeof(DateTime); //dateTime


                foreach (DataRow row in dataTable_Temp.Rows)
                {
                    dataTable_Temp2.ImportRow(row);
                }

Zum besseren Verständnis habe ich noch ein Bild angehängt.

Gruß,
Richard

13.12.2016 - 13:59 Uhr

//....
                       List<int> maxLength =
                       Enumerable.Range(0, dt.Columns.Count)
            .Select(column => dt.AsEnumerable()
            .Select(row => (row[column]).ToString()).OfType<string>()
            .Max(x => x.Length)).ToList();


foreach (DataRow row in dt.Rows)
                {
                    for (int count = 0; i < dt.Columns.Count; count++)
                    {
                        string addBlanks = "";
                        result.Append(row[count].ToString());

                        if (count == dt.Columns.Count - 1)
                        {
                            result.Append("\n");
                        }

                        else
                        {
                            int stringLength = row[count].ToString().Length;
                            int stringDiffrence = maxLength[count] - stringLength;
                            result.Append(addBlanks.PadRight(stringDiffrence+10));
                        }
                    }
                    result.AppendLine();
//...

13.12.2016 - 13:49 Uhr

Vorab einmal durch die Tabelle laufen und dabei die maximale Länge pro Spalte ermitteln.

Dann einfach mit diesen ermittelten Werten die Daten formatiert in die Datei schreiben.

Super danke für den simplen, aber hilfreichen Tipp. Nach 10min war das Problem gelöst 😉

@gfoidl: Deine Variante ist auf jeden Fall die elegantere

12.12.2016 - 15:46 Uhr

verwendetes Datenbanksystem: <Datatable>

Hallo,

ich habe in meinem Datatable n Spalten und m Zeilen. Der gesamte Datatable soll in ein Textfile geschrieben werden und dabei noch "schön" aussehen.

Mit schön aussehen meine ich, dass die Einträge jeder Spalte bündig untereinander stehen.

RICHTIG:

333333___Hallo__________________1_____a
444444___Wie___________________2_____a
555555___Geht__________________3_____a
888888____EsEuchAllenZusammen___4______a

*der Unterstrich soll Leerzeichen/Tabs darstellen

FALSCH:

333333 Hallo 1 a
444444 Wie 2 a
555555 Geht 3 a
888888 EsEuchAllenZusammen 4 a

Bisher bekomme ich die Spalten nicht schön untereinander geschrieben, sobald ein Eintrag in einer Spalte deutlich länger ist als die anderen Einträge.

Wer kann mir hierzu eine Lösung anbieten.

Umgesetzt habe ich das bisher folgendermaßen:


//......
var result = new StringBuilder();
                foreach (DataRow row in dataTable.Rows)
                {
                    for (int i = 0; i < dataTable.Columns.Count; i++)
                    {
                        result.Append(row[i].ToString());
                        result.Append(i == dataTable.Columns.Count - 1 ? "\n" : "\t\t");
                    }
                    result.AppendLine();
                }

                file.WriteLine(result.ToString());
//.......

LG,
Richard

20.06.2016 - 18:05 Uhr

Für ein Video würde ich folgendes probieren:

        

string path = "U:\\a.avi";

public byte[] GetBytesFromFile(string path)
{
            FileStream filestream = File.OpenRead(path);

                byte[] bytes = File.ReadAllBytes(path);
                filestream.Read(bytes, 0, Convert.ToInt32(filestream.Length));
                filestream.Close();

                return bytes;
}


15.06.2016 - 17:15 Uhr

Damit das Ergebnis genauso lang wird wie das Original, muss es mit derselben framerate gespeichert werden, wie es aufgenommen wurde. Liegt auf der Hand. Sonst müsste er sich Frames aus den Fingern saugen.

In diese Variablen schreibe ich welche Auflösung und Framerate meine Cam hat. Richtig?
Und anschließend speichere ich das Video mit denselben Eigenschaften ab.

            
int height = FinalVideo.VideoCapabilities[0].FrameSize.Height; //480
int width =  FinalVideo.VideoCapabilities[0].FrameSize.Width; //640
int frameRate = FinalVideo.VideoCapabilities[0].AverageFrameRate; //30
FileWriter.Open("U:\\a.avi", width, height, frameRate, VideoCodec.MPEG4, bitRate);

timer1.Enabled = true;
timer1.Start();

Hängt das nicht auch noch mit meinem Timer zusammen. Also wenn ich den Timer auf 10sec stelle, bekomme ich immer noch kein 10sec Video, sondern ein 7sec Video.

Gruß,
Richard

15.06.2016 - 16:01 Uhr

Hallo nochmal,

das Problem, dass die Videos so groß sind konnte ich lösen. Habe jetzt statt dem AVIWriter den FileWriter verwendet und als VideoCodec MPEG4 gewählt.

Folgendes Problem habe ich leider immer noch:

Kann mir einer sagen, warum mein Video immer eine andere Länge hat, sobald ich die frameRate verändere. Und an welchen Stellschrauben ich drehen muss, damit bei jeder beliebigen Framerate ein gleich langes Video dabei herauskommt.

Gruß,
Richard

15.06.2016 - 10:26 Uhr

Was auch immer 'video' ist, für mich sieht das so aus, als würdest du der Variabel immer nur ein Bitmap zuweisen?

Video ist auch eine Bitmap.

private Bitmap video = null;

So wie ich den AVIWriter verstehe fügt er mehrere Bitmaps zu einem Video zusammen:

AVIwriter.AddFrame(video);

Inzwischen bekomme ich jetzt auch das Video das ich möchte nur die Zeit stimmt nicht überein.

Habe es jetzt mal mit einem Timer von 60sec versucht.

Ergebnis:

Bei 60sec dauert das Video nur 53 sec.

EDIT: Leider ist mir aufgefallen, dass auch die Dauer des Videos auch stark von der eingestellten Auflösung meiner USB-Kamera abhängt. Je größer die Auflösung desto kürzer das Video bei gleicher Zeit.

Ein weiterer negativer Nebeneffekt das Video braucht 1,15GB für 53sec Video. Erscheint mir etwas viel.

Ich poste nochmal meinen aktuellen Code. Ich weis man soll nur Schnipsel einfügen, aber ich denke um die Zusammenhänge zu sehen zwischen Events und Handler ist das nötig. Wie gesagt das Video machen funktioniert. Allerdings mit falschen Zeiten:

using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.VFW;


namespace WindowsFormsApplication13
{
    public partial class Form1 : Form
    {
        private FilterInfoCollection VideoCaptureDevices;
        private VideoCaptureDevice FinalVideo = null;
        private VideoCaptureDeviceForm captureDevice;
        private Bitmap video = null;
        private AVIWriter AVIwriter = new AVIWriter();
        private int duration ;

        private bool stopVideo;
        //private SaveFileDialog saveAvi;
        public Form1()
        {
            InitializeComponent();
        }

        private void butStart_Click(object sender, EventArgs e)
        {
            stopVideo = false;
            duration = 60;


            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            captureDevice = new VideoCaptureDeviceForm();

            if (captureDevice.ShowDialog(this) == DialogResult.OK)
            {
                VideoCaptureDevice videoSource = captureDevice.VideoDevice;
                FinalVideo = captureDevice.VideoDevice;

                FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
                FinalVideo.Start();
                                
            }

            int h = captureDevice.VideoDevice.VideoResolution.FrameSize.Height;
            int w = captureDevice.VideoDevice.VideoResolution.FrameSize.Width;
            AVIwriter.Open("U:\\a.avi", w, h);
            timer1.Enabled = true;
            timer1.Start();
        }

        void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (stopVideo==false)
            {
                video = (Bitmap)eventArgs.Frame.Clone();
                AVIwriter.Quality = 0;
                AVIwriter.AddFrame(video); 
            }
            else if (stopVideo==true)
            {
                video = (Bitmap)eventArgs.Frame.Clone();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (FinalVideo == null)
            { return; }
            if (FinalVideo.IsRunning)
            {
                this.FinalVideo.Stop();
                this.AVIwriter.Close();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            duration--;

            textBox1.Text = duration.ToString();

            if (duration ==0)
            {
                timer1.Stop();
                stopVideo = true;

                if (FinalVideo == null)
                { return; }

                if (FinalVideo.IsRunning)
                {
                    this.FinalVideo.Stop();
                    this.AVIwriter.Close();
                }
            }
        }
    }
}
15.06.2016 - 09:27 Uhr

Hallo,

habe mir jetzt die Spielregeln durchgelesen 😉 und versuche das Problem konkreter zu beschreiben:

Der Timer läuft wie er soll runter von 20 auf 0. Sprich das Video sollte dann auch 20sec lang sein (Interval ist auf 1000ms). Allerdings ist mein Video 10sec lang. Was noch fataler ist: Das Video ist ein Standbild. Habe also eine Videodatei auf der keine Bewegung zu sehen ist. Ich möchte aber ein ganz normales Video. Es scheint so, als ob nur ein einziger Frame gezogen wird und der AVIWriter das defaultmäßig auf 10sec zieht. Ich hoffe ich konnte mein Problem jetzt besser darlegen 😉

Gruß
Richard

14.06.2016 - 18:22 Uhr

Hallo,

ich versuche seit geraumer Zeit mit einer am PC angeschlossenen USB-Cam ein avi-Video von 20sec aufzuzeichnen und zu speichern. Habe mir das Ganze überlegt mit einem Timer von 20sec zu machen. Ich nutze die Libaries von AForgeNET. Leider haut das Ganze bisher nicht hin. Vielleicht kann mir jemand auf die Sprünge helfen wo der Fehler/die Fehler liegen.

private void buttonStart_Click(object sender, EventArgs e)
        {
            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            captureDevice = new VideoCaptureDeviceForm();

            if (captureDevice.ShowDialog(this) == DialogResult.OK)
            {

                VideoCaptureDevice videoSource = captureDevice.VideoDevice;
                FinalVideo = captureDevice.VideoDevice;

                FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
                FinalVideo.Start();
            }

            stopVideo = false;
            duration = 20;


            while (video == null)
            { }
            video.Save("U:\\a.avi");

            int h = captureDevice.VideoDevice.VideoResolution.FrameSize.Height;
            int w = captureDevice.VideoDevice.VideoResolution.FrameSize.Width;
            AVIwriter.Open("U:\\a.avi", w, h);

            timer1.Enabled = true;
            timer1.Start();

            //while (stopVideo == false)
            //{ }

        }
        void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (stopVideo==true)
            {
                video = (Bitmap)eventArgs.Frame.Clone();
                AVIwriter.Quality = 0;
                AVIwriter.AddFrame(video); //addd new frame to pend video file
            }
            else
            {
                video = (Bitmap)eventArgs.Frame.Clone();
            }
        }


       
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (FinalVideo == null)
            { return; }
            if (FinalVideo.IsRunning)
            {
                this.FinalVideo.Stop();
                this.AVIwriter.Close();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            duration--;

            textBox1.Text = duration.ToString();

            if (duration ==0)
            {
                timer1.Stop();
                stopVideo = true;

                if (FinalVideo == null)
                { return; }

                if (FinalVideo.IsRunning)
                {
                    this.FinalVideo.Stop();
                    this.AVIwriter.Close();
                }
            }
        }

Guten Abend,
Richard