Пыталась отправить данные, создавая кадры с использованием буфера, но кадр, возможно, частично визуализируется. поскольку данные, генерируемые из 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;
}
Код: Выделить всё
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);
};
Код: Выделить всё
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]
Мобильная версия