Untitled
unknown
csharp
2 years ago
7.3 kB
12
Indexable
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);
}
}
}
}Editor is loading...
Leave a Comment