Проблема потоковой передачи H264 с IDBC#

Место общения программистов C#
Ответить
Anonymous
 Проблема потоковой передачи H264 с IDB

Сообщение Anonymous »

Я работаю над приложением-отправителем WebRTC, использующим .NET Core, SIPSorcery и видеопоток idb для потоковой передачи видео с устройства iOS. Мой сервер сигнализации использует WebSocket (Socket.IO). Одноранговое соединение успешно установлено, и обмен кандидатами ICE и предложениями/ответами SDP осуществляется правильно. Однако видео отображается неправильно на стороне приемника. Кадры кажутся неполными или поврежденными, несмотря на постоянные журналы, показывающие, что видеокадры отправляются со стороны отправителя.
Пыталась отправить данные, создавая кадры с использованием буфера, но кадр, возможно, частично визуализируется. поскольку данные, генерируемые из idb, видеопоток имеет форму фрагментов для одного кадра.
Среда:
  • Библиотека WebRTC: SIPSorcery
  • Сервер сигнализации: WebSocket (Socket.IO)
  • Источник видеопотока: видеопоток idb в формате H264< /li>
    Платформа: .NET Core 5
Выполненные шаги:
  • Настройте сервер сигнализации для обмена предложениями/ответами SDP и кандидатами ICE.
  • Установите одноранговое соединение WebRTC с помощью SIPSorcery.
  • Потоковая передача видео с устройства iOS с использованием idb video-stream --format h264.
Фрагмент кода:

Вот упрощенная версия моя текущая реализация:
Функция для получения потока iOS

Код: Выделить всё

private static async Task GetVideoStream()
{
string idbCmd = $"video-stream --udid {IOS_DEVICE_UDID} --format h264";

ProcessStartInfo idbStartInfo = new ProcessStartInfo
{
FileName = "idb",
Arguments = idbCmd,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};

var idbProcess = new Process
{
StartInfo = idbStartInfo
};

idbProcess.Start();

return idbProcess.StandardOutput.BaseStream;
}
Получение видеопотока и преобразование данных потока в кадры, которые отправляются в PeerConnection

Код: Выделить всё

var videoStream = await GetVideoStream();
var rawFramesSource = new RawFramesSource(videoStream);

var h264Format = new VideoFormat(VideoCodecsEnum.H264, 96);
MediaStreamTrack videoTrack = new MediaStreamTrack(new List { h264Format }, MediaStreamStatusEnum.SendRecv);
pc.addTrack(videoTrack);

rawFramesSource.OnVideoSourceEncodedSample += (uint timestamp, VideoFormat format, byte[] sample) =>
{
pc.SendVideo(timestamp, sample);
};
Класс RawFramesSource для преобразования данных потока в кадры

Код: Выделить всё

public class RawFramesSource
{
private readonly Stream _videoStream;
public VideoFormat VideoFormat { get; set; }

public delegate void EncodedSampleDelegate(uint timestamp, VideoFormat format, byte[] sample);
public event EncodedSampleDelegate OnVideoSourceEncodedSample;

public RawFramesSource(Stream videoStream)
{
_videoStream = videoStream;
}

public void Start()
{
Task.Run(ReadFrames);
}

private async Task ReadFrames()
{
byte[] buffer = new byte[65536];
while (true)
{
int bytesRead = await _videoStream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead 

Подробнее здесь: [url]https://stackoverflow.com/questions/78730308/h264-streaming-issue-with-idb[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»