Je cherche un moyen universel de vider le flux rtsp. Je veux comprendre que certains flux rtsp fonctionnent bien et que le serveur envoie des vidéos regardables.
openRTSP
Au début, Google me recommande openRTSP tool.
openRTSP -4 ${stream_link} > ${output_file}
Mais le fichier vidéo de sortie vidé par cet outil n'est pas vraiment correct. Le décodeur vidéo (ffdec) renvoie de nombreuses erreurs comme "Impossible de décoder le paquet vidéo" et "[h264] pas de trame!", Qui ne me conviennent pas.
ffmpeg
Ensuite, j'ai essayé de vider le flux rtsp avec l'outil ffmpeg.
ffmpeg -loglevel debug -i "${stream_link}" -s 640x480 -vcodec copy -acodec copy -y ${output_file}
Mais le processus de streaming était souvent interrompu par erreur:
Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument
J'essaie d'utiliser --fflags igndts
mais ffmpeg n'ignore pas ces erreurs. Cela n'a aucun sens, car cette erreur signifie que les flux audio et vidéo sont envoyés de manière asynchrone. Le pire, c'est que le fichier vidé, résultant de ce vidage interrompu, n'est pas correct non plus. Ffdec renvoie une erreur:
ERROR [mov,mp4,m4a,3gp,3g2,mj2] moov atom not found
ERROR [ffdec] av_open_input_file: Operation not permitted
Après une belle tasse de recherche sur Google, j'ai trouvé que c'était vraiment vieux bogue muxer de ffmpeg .
mplayer
J'ai essayé d'utiliser mplayer avec LIVE_555 lib.
mplayer -noframedrop -dumpfile ${output_file} -dumpstream ${stream_link}
Mais j'ai aussi des erreurs.
Stream not seekable!
Core dumped ;)
Question
Je pense que je fais quelque chose de mal. C'est vraiment ridicule, qu'il n'y a aucun moyen de sauvegarder le flux rtsp dans un fichier vidéo correct et jouable.
Peut-être existe-t-il d'autres outils qui peuvent vous aider dans cette tâche? En fait, je serai reconnaissant de tout conseil pour toutes sortes de bibliothèques et de langues. Mais ce processus devrait être automatique et avoir cli.
Améliorations
Quelque chose à propos de 50% d'expériences que j'ai faites sur l'hôte local avec vlc-streamer qui émule rtsp-broadcaster. Voici un manuel que j'essaie de suivre.
J'ai ffmpeg vraiment frais et dernier avec le support x264, que j'ai installé par that thread utile.
Avez-vous essayé vlc pour enregistrer le flux rtsp? Cela a fonctionné pour moi, mais j'ai essayé avec une interface graphique. Mais cela devrait également fonctionner à partir de la ligne de commande.
Dmitry, vous devriez essayer serveur ErlyVideo . Il peut capturer le trafic RTSP et le stocker dans des fichiers multimédias pouvant être lus avec des lecteurs multimédias.
ffmpeg est le moyen le plus simple d'atteindre votre objectif, mais voici quelques notes importantes:
Tout d'abord, je vous conseille d'obtenir la dernière version (2.4.x au lieu de 1.2.x livrée avec Ubuntu). Vous pouvez l'obtenir auprès de https://www.ffmpeg.org/download.html
Vous obtiendrez toujours le
Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument error
erreur mais vous pouvez vous en débarrasser. Cela est principalement dû au fait que les FPS (Frames Per Second) changent constamment sur les caméras IP en fonction de la qualité de la connexion. Voici 2 solutions qui ont fonctionné pour moi:
Solution 1 = utilisez l'option use_wallclock_as_timestamps pour que votre commande ressemble à
ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://myip:554/mpeg4 -c copy myrecord.avi
PROS = faible utilisation du CPU + enregistrements de bonne qualité car rien n'est transcodé/CONS = fichiers légèrement gros (~ 6Mb/minute)
Solution2 = suppression des options "-acodec copy -vcodec copy" dans votre commande. La commande simple
ffmpeg -i rtsp://myip:554/mpeg4 myrecord.avi
fera l'affaire. PROS = petits fichiers (~ 1,2 Mo/minute)/CONS = utilisation élevée du processeur (6% sur mon ordinateur), car je pense qu'il transcode les codecs par défaut + enregistrements de mauvaise qualité
J'espère que ça aide!
Vider le ou les flux de toute vidéo Youtube vers un appareil local en utilisant [~ # ~] openrtsp [~ # ~]
À titre d'exemple, j'utiliserai le flux rtsp disponible pour toute vidéo youtube.
Pas:
Détails sur le processus manuel de vidage du flux:
Le terrain de jeu Oauth 2 est un bon outil https://code.google.com/oauthplayground/
Demandez ce qui suit:
champs en texte clair spec = media: group/media: content [@yt: format = "1"]
La réponse est json stream. Copiez cela depuis le formulaire oauth et collez-le dans: http://json.parser.online.fr/ et vous aurez quelque chose comme:
"entry":{
"xmlns":"http://www.w3.org/2005/Atom",
"xmlns$media":"http://search.yahoo.com/mrss/",
"xmlns$yt":"http://gdata.youtube.com/schemas/2007",
"media$group":{
"media$content":[
{
"url":"rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
"type":"video/3gpp",
"medium":"video",
"expression":"full",
"duration":64,
"yt$format":1
}
]
Prenez l'attribut [~ # ~] rtsp [~ # ~] url de cela et appelez openrtsp pour faire le vidage de fichier. Vous devrez [~ # ~] attendre [~ # ~] car openrtsp diffusera le média (pas le téléchargement). Si vous demandez un vidage d'un fichier .mp4 de 10 minutes, vous devrez attendre 10 minutes.
REMARQUE: le SDP derrière l'URI rtsp conserve des sources distinctes pour chaque piste. Ainsi, avec le vidage, vous obtenez des fichiers séparés pour chaque piste dans le fichier multimédia d'origine.
$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Dumpfile, les sorties seront:
Les détails de Stdout incluent le protocole complet de la session RTSP:
$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Opening connection to 74.125.213.247, port 554...
...remote connection opened
Sending request: OPTIONS rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 2
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Received 140 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
Public: DESCRIBE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, SETUP, SET_PARAMETER, TEARDOWN
CSeq: 2
Server: Google RTSP 1.0
Sending request: DESCRIBE rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 3
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Accept: application/sdp
Received 776 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
Content-Type: application/sdp
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
Content-Base: rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/
CSeq: 3
Server: Google RTSP 1.0
Content-Length: 404
v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align
Opened URL "rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp", returning a SDP description:
v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align
Created receiver for "video/H263-2000" subsession (client ports 52320-52321)
Created receiver for "audio/AMR" subsession (client ports 52322-52323)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0 RTSP/1.0
CSeq: 4
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52320-52321
Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52320-52321;server_port=10580-10581;source=74.125.213.247;ssrc=7B551CAA
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 4
Server: Google RTSP 1.0
setup response srvAddr port rtpchnl 74.125.213.247 10580 255
Setup "video/H263-2000" subsession (client ports 52320-52321)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1 RTSP/1.0
CSeq: 5
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52322-52323
Session: 4d04d0e9
Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52322-52323;server_port=10580-10581;source=74.125.213.247;ssrc=10CD5DCE
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 5
Server: Google RTSP 1.0
setup response srvAddr port rtpchnl 74.125.213.247 10580 255
Setup "audio/AMR" subsession (client ports 52322-52323)
Created output file: "video-H263-2000-1"
Created output file: "audio-AMR-2"
Sending request: PLAY rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 6
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9
Range: npt=0.000-63.800
Received 394 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Range: npt=0.000-63.800
RTP-Info: url=rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0;seq=48690;rtptime=668323490,url=rtsp://v
8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1;seq=61565;rtptime=99689199
CSeq: 6
Server: Google RTSP 1.0
Started playing session
Receiving streamed data (for up to 68.800000 seconds)...
Sending request: TEARDOWN rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 7
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9
Received 72 new bytes of response data.
Received a complete TEARDOWN response:
RTSP/1.0 200 OK
CSeq: 7
Session: 4d04d0e9
Server: Google RTSP 1.0
VLC est le premier qui me vient à l'esprit. Je vais habituellement sur cet ancien site www.vcdhelp.com et sous le panneau " How To " sur le côté gauche, cliquez sur " Tous les guides ", saisissez votre paramètre de recherche dans " Recherche de texte ".
Pour votre solution, consultez: http://www.videohelp.com/tools/StreamTransport (freeware)
Que diriez-vous d'utiliser libpcap pour créer un outil de type tcpdump/Wireshark? En supprimant les en-têtes générés par les couches sous la couche application (c'est-à-dire TCP/UDP/IP/...), vous aurez accès au flux RTSP. Le flux peut ensuite être sauvegardé dans un fichier sur le disque. Je dois admettre que je ne suis pas très familier avec RTP/RTSP, alors peut-être que vous devez également supprimer ces en-têtes et simplement écrire la charge utile dans le fichier (pour qu'un lecteur multimédia puisse le lire).