Подтверждение DTLS не выполняется из-за «не согласованного профиля SRTP» при потоковой передаче из ffmpeg (schannel) на Python

Программы на Python
Ответить
Anonymous
 Подтверждение DTLS не выполняется из-за «не согласованного профиля SRTP» при потоковой передаче из ffmpeg (schannel) на

Сообщение Anonymous »

Я пытаюсь протестировать потоковую передачу видео с малой задержкой, используя протокол ffmpeg WHIP для потоковой передачи на сервер Python на базе aiortc. Соединение ICE завершается успешно, но рукопожатие DTLS завершается неудачно: «Нет согласованного профиля SRTP».
Моя сборка ffmpeg (ночная 20251120) скомпилирована с --enable-schannel вместо --enable-openssl, я не знаю, является ли это источником неудачного рукопожатия.
Код сервера:

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

from aiohttp import web
from aiortc import RTCPeerConnection, RTCSessionDescription, RTCConfiguration, RTCIceServer
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

whip_sessions = {}

async def whip_endpoint(request):
global whip_sessions
sdp = await request.text()
config = RTCConfiguration(
iceServers=[RTCIceServer(urls=["stun:stun.l.google.com:19302"])]
)
pc = RTCPeerConnection(configuration=config)

session_id = id(pc)
whip_sessions[session_id] = {
'pc': pc,
'video_track': None
}

@pc.on('track')
async def on_track(track):
global whip_sessions
if track.kind == 'video':
whip_sessions[session_id]['video_track'] = track
logger.info('subscribed to video stream')

await pc.setRemoteDescription(
RTCSessionDescription(sdp=sdp, type='offer')
)
answer = await pc.createAnswer()
await pc.setLocalDescription(answer)

return web.Response(
content_type='application/sdp',
text=pc.localDescription.sdp,
status=201,
headers={
'Location': f'/whip/{session_id}'
}
)

async def whip_delete(request):
global whip_sessions
session_id = int(request.match_info['id'])
session = whip_sessions.get(session_id)
if session:
await session['pc'].close()
whip_sessions.pop(session_id, None)
logger.info(f"Session {session_id} terminated")
return web.Response(status=200)
else:
logger.warning(f"Session {session_id} not found")
return web.Response(status=404, text='Session not found')

if __name__ == '__main__':
app = web.Application()
app.router.add_post('/whip', whip_endpoint)
app.router.add_delete('/whip/{id}', whip_delete)
web.run_app(app, host='127.0.0.1', port=8080)
Команда ffmpeg:

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

ffmpeg -re -f lavfi -i testsrc=size=640x360:rate=30 -f lavfi -i sine=frequency=440:sample_rate=48000 \
-c:v libx264 -preset ultrafast -tune zerolatency -b:v 500k -g 30 -pix_fmt yuv420p \
-c:a libopus -b:a 128k -ac 2 \
-f whip http://localhost:8080/whip
вывод отладки:

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

INFO:aioice.ice:Connection(0) ICE completed
DEBUG:aiortc.rtcicetransport:RTCIceTransport(controlled) - checking -> completed
DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() iceConnectionState checking -> completed DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(client) - State.NEW -> State.CONNECTING
DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(client) x DTLS handling timeout
DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(client) x DTLS handshake failed (no SRTP profile negotiated) DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(client) - State.CONNECTING -> State.FAILED
DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() connectionState connecting -> failed
Кто-нибудь успешно выполнял потоковую передачу из ffmpeg в aiortc с помощью WHIP?

Подробнее здесь: https://stackoverflow.com/questions/798 ... from-ffmpe
Ответить

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

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

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

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

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