Untitled

mail@pastecode.io avatar
unknown
csharp
15 days ago
7.3 kB
2
Indexable
Never
using FFmpeg.AutoGen;
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Video Files (*.mp4, *.avi, *.mkv)|*.mp4;*.avi;*.mkv|All Files (*.*)|*.*";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                txtVideoPath.Text = openFileDialog.FileName;
            }
        }

        private void txtStreamKey_TextChanged(object sender, EventArgs e)
        {
            string streamKey = txtStreamKey.Text;
        }

        private void txtFPS_TextChanged(object sender, EventArgs e)
        {
            string fps = txtFPS.Text;
        }

        private void txtBitrate_TextChanged(object sender, EventArgs e)
        {
            string bitrate = txtBitrate.Text;
        }

        unsafe private void btnStartStreaming_Click(object sender, EventArgs e)
        {
            try
            {
                string videoPath = txtVideoPath.Text;
                string streamKey = txtStreamKey.Text;
                int fps, bitrate;

                if (!int.TryParse(txtFPS.Text, out fps) || !int.TryParse(txtBitrate.Text, out bitrate))
                {
                    MessageBox.Show("FPS dan Bitrate harus berupa angka.");
                    return;
                }

                // Konfigurasi ffmpeg
                // Konfigurasi ffmpeg
                ffmpeg.avformat_network_init();

                // Definisikan format input
                AVFormatContext* inputFormatContext = null;
                if (ffmpeg.avformat_open_input(&inputFormatContext, videoPath, null, null) != 0)
                {
                    MessageBox.Show("Gagal membuka file video.");
                    return;
                }

                if (ffmpeg.avformat_find_stream_info(inputFormatContext, null) < 0)
                {
                    MessageBox.Show("Gagal mencari informasi stream.");
                    return;
                }

                // Definisikan format output
                AVFormatContext* outputFormatContext = null;
                string outputUrl = $"rtmp://a.rtmp.youtube.com/live2/{streamKey}";
                if (ffmpeg.avformat_alloc_output_context2(&outputFormatContext, null, "flv", outputUrl) < 0)
                {
                    MessageBox.Show("Gagal membuat konteks output.");
                    return;
                }

                // Tambahkan stream video
                AVStream* videoStream = ffmpeg.avformat_new_stream(outputFormatContext, null);
                if (videoStream == null)
                {
                    MessageBox.Show("Gagal menambahkan stream video.");
                    return;
                }

                // Konfigurasi stream video
                videoStream->codecpar->codec_id = AVCodecID.AV_CODEC_ID_H264;
                videoStream->codecpar->codec_type = AVMediaType.AVMEDIA_TYPE_VIDEO;
                videoStream->codecpar->width = inputFormatContext->streams[0]->codecpar->width;
                videoStream->codecpar->height = inputFormatContext->streams[0]->codecpar->height;
                videoStream->codecpar->format = (int)AVPixelFormat.AV_PIX_FMT_YUV420P;
                videoStream->time_base = inputFormatContext->streams[0]->time_base;

                // Buka file output
                if (ffmpeg.avio_open(&outputFormatContext->pb, outputUrl, ffmpeg.AVIO_FLAG_WRITE) < 0)
                {
                    MessageBox.Show("Gagal membuka file output.");
                    return;
                }

                // Tulis header output
                if (ffmpeg.avformat_write_header(outputFormatContext, null) < 0)
                {
                    MessageBox.Show("Gagal menulis header output.");
                    return;
                }

                while (true)
                {
                    // Read frame from input
                    int frameSize = ffmpeg.av_read_frame(inputFormatContext, packet);
                    if (frameSize < 0)
                    {
                        // End of stream reached
                        break;
                    }

                    // Convert frame to RGB
                    int srcStride = ffmpeg.avpicture_get_size(videoStream->codecpar->format, videoStream->codecpar->width, videoStream->codecpar->height);
                    byte[] srcData = new byte[srcStride * videoStream->codecpar->height];
                    ffmpeg.avpicture_fill((AVPicture)frame, srcData, (AVPixelFormat)videoStream->codecpar->format, videoStream->codecpar->width, videoStream->codecpar->height);

                    // Convert frame to YUV
                    int dstStride = ffmpeg.sws_get_stride(videoStream->codecpar->width, videoStream->codecpar->height, (AVPixelFormat)videoStream->codecpar->format);
                    byte[] dstData = new byte[dstStride * videoStream->codecpar->height];
                    SwsContext* swsContext = ffmpeg.sws_getContext(videoStream->codecpar->width, videoStream->codecpar->height, (AVPixelFormat)videoStream->codecpar->format,
                                                                    outputFormatContext->streams[videoStream->index]->codecpar->width, outputFormatContext->streams[videoStream->index]->codecpar->height,
                                                                    (AVPixelFormat)outputFormatContext->streams[videoStream->index]->codecpar->format,
                                                                    ffmpeg.SWS_BICUBIC,
                                                                    null,
                                                                    null,
                                                                    null);
                    ffmpeg.sws_scale(swsContext, new IntPtr[] { srcData }, new int[] { srcStride }, 0, videoStream->codecpar->height, new byte[] { 0 }, dstData, dstStride);

                    // Write frame to output
                    ffmpeg.av_init_packet(packet);
                    packet->stream_index = videoStream->index;
                    packet->data = dstData;
                    packet->size = dstStride * videoStream->codecpar->height;
                    FFmpeg.av_write_frame(outputFormatContext, packet);

                    // Clean up
                    ffmpeg.av_freep(srcData);
                    ffmpeg.av_freep(dstData);
                    ffmpeg.sws_free(swsContext);
                }

                // Close input and output files
                ffmpeg.av_close_input(inputFormatContext);
                ffmpeg.av_close_output(outputFormatContext);

                // Free packet and frame
                ffmpeg.av_packet_free(&packet);
                ffmpeg.av_frame_free(&frame);
            }
        }
    }
}
Leave a Comment