Streaming avec ffmpeg

Bonjour à tous !

Je cherche un exemple de programme qui stream de la vidéo sur un réseau, en udp et/ou rtp, et qui utilise la librairie ffmpeg.
Quelqu’un sait il où je peux trouver ça ?

Je vous remercie d’avance !

non mais si tu trouves ça m’intéresse :smiley:

J’ai fais ste micro doc, si ça intéresse:

% cat vlc.txt                                                                            [0.80 0.49 - ]
dependances debian:
gcc g++ libc6-dev libdvbpsi5-dev libmpeg4ip-dev libopenjpeg-dev libxvidcore4-dev libxv-dev libmpeg2-4-dev libfribidi-dev


export CPPFLAGS="-I/home/ed/vlc-vdr/include"
export LDFLAGS="-L/home/ed/vlc-vdr/lib"
export LD_LIBRARY_PATH="/home/ed/vlc-vdr/lib:$LD_LIBRARY_PATH"
export PATH="/home/ed/vlc-vdr/bi:n$PATH"

FFMpeg:

svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libxvid --enable-libvorbis --enable-libtheora  --enable-libspeex --enable-libopenjpeg     --enable-libgsm   --enable-libfaac  --enable-libfaad   --enable-bzlib   --enable-nonfree   --enable-postproc   --enable-swscale    --enable-avfilter   --enable-avfilter-lavf   --enable-pthreads   --enable-shared  --prefix=/home/ed/vlc-vdr
make -j2
make install

VLC:
wget http://download.videolan.org/pub/videolan/vlc/0.9.8a/vlc-0.9.8a.tar.bz2
tar xvjf vlc-0.9.8a.tar.bz2
cd vlc-0.9.8a
./configure  --enable-vlc  --enable-loader  --enable-qt4    --enable-theora  --enable-speex  --enable-vorbis   --enable-libmpeg2  --enable-flac  --enable-postproc  --enable-avformat   --enable-avcodec   --enable-dvdread   --enable-switcher  --enable-sout    --enable-shared --enable-release --enable-dvbpsi --prefix=/home/ed/vlc-vdr
make -j2
make install

DIsplay: rajouter dst=display

script streamvdr:

#!/bin/sh

export CPPFLAGS="-I/home/ed/vlc-vdr/include"
export LDFLAGS="-L/home/ed/vlc-vdr/lib"
export LD_LIBRARY_PATH="/home/ed/vlc-vdr/lib:$LD_LIBRARY_PATH"
export PATH="/home/ed/vlc-vdr/bin:$PATH"

exec cvlc http://192.168.6.2:37890/ --intf http --no-playlist-autostart --http-src=/home/ed/vlc-vdr/http-fbx/ --http-host :8080 --sout-standard-access=udp --sout-standard-mux=ts --sout-standard-url=212.27.38.253:1234 --file-caching=1000 --sout-ts-pid-video=68 --sout-ts-pid-audio=69 --sout-ts-pcr=80 --sout-ts-dts-delay=400 --sout '#transcode{venc=ffmpeg,vcodec=mp2v,vb=4600,scale=1,fps=25,maxwidth=720,maxheight=576,hurry-up=1,acodec=mpga,ab=384,channels=2}:duplicate{dst=std{access=udp,mux=ts,dst=212.27.38.253:1234}' --rt-priority --no-inhibit --loop --http-reconnect $@

A+

Dsl de ne pas l’avoir précisé, mais c’est un programme en langage C que je recherche.

Je te remercie quand même !

Tu peux regarder le code de FFserver :

Si j’ai bon souvenir FFserver est un binaire qui vient avec les sources de ffmpeg non ?

Justement ça fait des semaines que je fouine dans le code de ffmpeg/ffserser.
C’est pas super intuitif…

C’est d’ailleurs mon désespoir qui vient me faire poste ici :cry: .

Salut,

Ben via FFMPEG c’est pas difficile :

VLC
MPLAYER
MENCODER
etc…

Pour info :

FFserver fait grossièrement 4000 Lignes c’est court car la plupart des fonctions proviennent de l’API AV.

Sinon l’API AV doit faire minimum 100000 Lignes et je pense que je suis gentil.

Conseil :

Avant de vouloir comprendre le serveur de streaming il faut comprendre le média(Audio,vidéo).
Ce qu’es un ES (Elementary Stream) ou un PES (Packetized Elementary Stream) . C’est quoi le MPEG 1 ,2 ,4. etc…
Une frame, Une Trame , Une image , Un block , un splice, un macro-block, dts , pts, gop , key, IPBB etc…

Enfin je pense que le mieux et d’abord de comprendre comment fonctionne FFserver avant d’attaquer du lourd…

Pour t’aider regarde les différentes méthodes du Protocole RTSP:

Normalement dans une session RTSP nous appelons les différents méthodes dans cette ordre :

Options : Méthodes implémentés par le serveur
Describe : renvoie un SDP (en gros)
Setup : récupère les ports client et attribue les ports serveur et le npt
Teardown : fin du stream (efface la session)

sous FFserver les méthodes commencent par rtsp_cmd_ .

Sinon voici les deux structures les plus utilisées (Liste Chainée) :

HTTPContext -> Pour chaque connexion HTTP ou pour une Session RTSP
FFStream -> Liste chainée contenant la bibliothèque des médias

Sinon FFserver fonctionne avec la primitive POLL :

C’est à dire que le noyau gère les évènements et la fonction HTTPServer() vérifie l’état de l’évènement ainsi en fonction de l’etat il redirige la requête .

Les fonctions gérant le poll :

HTTPServer() -> récupère deux sockets (RTSP et HTTP)
handle_server()

Je vous remercie pour toutes vos réponses.

J’ai fini par m’en sortir et avoir une application stable.

Bonjour,
ça fait un moment que je cherche un exemple de programme qui stream de la vidéo sur un réseau et j’ai fini par tomber sur ce forum. même j’ai essayé avec ffmpeg-0.6.1 sur kubuntu mais je n’ai pas réussie à le faire marcher, je n’ai pas bien compris le contenu du fichier ffserver.conf. Vraiment je galère depuis trois semaines surtout je suis un débutant en programmation.
J’ai vu que vous avez trouvé une solution pourriez vous m’aider SVP?

je vous remercie bien

Bonjour,

Dans un premier temps, je souhaite savoir ce que tu souhaites faire.
Veux tu utiliser une application pour faire de la diffusion vidéo ?
Ou souhaites tu développer (en langage C ?) ta propre application ?

Dans les deux cas, as tu une idée du protocole, format ou codec que tu veux utiliser ?

Bonjour,
Tout d’abord je vous remercie pour votre réponse.
donc l’idée générale est de diffuser des vidéo (situées sur mon ordinateur) sur le net, faire un serveur simple sans interface ressemblant à zumocast ( http://www.applicationipad.fr/zumocast-video-et-musique-en-streaming-sur-ipad.html ) même avec une seule vidéo l’essentiel qu’il marche. Après je compte développer une application Android pour lire cette vidéo.

Donc l’application sera sous Linux en langage C en utilisant le protocole RTP.
Après des recherches sur le net j’ai trouvé que FFmpeg peut la faire, j’ai téléchargé la version FFmpeg-0.6.1 (normalement contient FFmpeg, FFserver, FFplay, FFprobe). je l’ai compilé et l’ai exécuté en tapant les commandes :

sed -i ‘s/-number//’ Makefile && ./configure --prefix=/home/XTXE/testFFmpeg2
make
make install

Tout est bien passé et j’ai obtenu comme résultat : FFmpeg, FFserver et FFprobe mais pas FFplay!!!
j’ai commencé par manipuler FFmpeg en passant une video.flv en une video.mp4 et s’était bien passé sans aucune difficulté, en suite j’ai passé pour faire le streaming voilà ce que j’ai fait:
-création du fichier FFserver.conf et le mettre dans le même répertoire (bin) que FFserver

-mettre une vidéo (video.flv) dans le même répertoire (bin) que FFserver

-lancer ffserver : ./ffserver -f ffserver.conf &

et voilà “Could not start server” !!! :119

built on Jun 17 2011 11:33:45 with gcc 4.4.1 configuration: --prefix=/home/XTXE/testFFmpeg1 libavutil 50.15. 1 / 50.15. 1 libavcodec 52.72. 2 / 52.72. 2 libavformat 52.64. 2 / 52.64. 2 libavdevice 52. 2. 0 / 52. 2. 0 libswscale 0.11. 0 / 0.11. 0 bind(port 8090): Address already in use Tue Jun 21 10:52:58 2011 Could not start server

-lancer ffmpeg : ./ffmpeg -i /video.flv localhost:8090/feed1.ffm

à cet étape ça bloque voilà le message : “/video.flv: No such file or directory” :119

FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
  built on Jun 17 2011 11:33:45 with gcc 4.4.1
  configuration: --prefix=/home/XTXE/testFFmpeg1
  libavutil     50.15. 1 / 50.15. 1
  libavcodec    52.72. 2 / 52.72. 2
  libavformat   52.64. 2 / 52.64. 2
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0.11. 0 /  0.11. 0
/video.flv: No such file or directory

j’espère que j’ai bien explicité mon problème.

Voilà le contenu de FFserver.conf

[code]Port 8090
BindAddress 0.0.0.0
MaxClients 10

http://localhost:8090/feed1.ffm: Unknown format”

message très explicite …

MaxBandwidth 50000

On affiche tout sur la sortie standard

CustomLog -

On a besoin d’une seule source

File /tmp/feed1.ffm ACL allow 127.0.0.1

On va le diffuser en flv

Feed feed1.ffm VideoBitRate 5200 VideoBufferSize 32 Format swf VideoSize 320x240 VideoFrameRate 25 VideoQMin 3 VideoQMax 3 # Le NoAudio aussi cause une erreur très explicite s'il est omis et que la source n'a pas de son: # "Could not find input stream matching output stream #0.0" # ... NoAudio

Ce qui suit permet de suivre les infos du serveur de streaming

Format status ACL allow localhost [/code]

Pour FFmpeg “/video.flv: No such file or directory” c’est bon j’ai un “/” qui se balade tout seul avant le fichier video.flv :open_mouth: je l’ai supprimé et le FFmpeg a commencé l’encodage voilà ce que j’ai obtenu :

[code]m
FFmpeg version 0.6.1, Copyright © 2000-2010 the FFmpeg developers
built on Jun 17 2011 11:33:45 with gcc 4.4.1
configuration: --prefix=/home/XTXE/testFFmpeg1
libavutil 50.15. 1 / 50.15. 1
libavcodec 52.72. 2 / 52.72. 2
libavformat 52.64. 2 / 52.64. 2
libavdevice 52. 2. 0 / 52. 2. 0
libswscale 0.11. 0 / 0.11. 0
/video.flv: No such file or directory
XTXE@floPc:~/testFFmpeg1/bin$ ^C
XTXE@floPc:~/testFFmpeg1/bin$ ./ffmpeg -i video.flv http://localhost:8090/feed1.ffm
FFmpeg version 0.6.1, Copyright © 2000-2010 the FFmpeg developers
built on Jun 17 2011 11:33:45 with gcc 4.4.1
configuration: --prefix=/home/XTXE/testFFmpeg1
libavutil 50.15. 1 / 50.15. 1
libavcodec 52.72. 2 / 52.72. 2
libavformat 52.64. 2 / 52.64. 2
libavdevice 52. 2. 0 / 52. 2. 0
libswscale 0.11. 0 / 0.11. 0
[flv @ 0x9f70420]Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 59.83 (29917/500) -> 59.75 (239/4)
Input #0, flv, from ‘video.flv’:
Metadata:
duration : 71
starttime : 0
totalduration : 71
width : 854
height : 480
videodatarate : 737
audiodatarate : 129
totaldatarate : 875
framerate : 30
bytelength : 7753111
canseekontime : true
sourcedata : B4A7DD224MM1308575362337889
purl :
pmsg :
Duration: 00:01:10.88, start: 0.000000, bitrate: 886 kb/s
Stream #0.0: Video: h264, yuv420p, 854x480, 755 kb/s, 59.75 tbr, 1k tbn, 59.83 tbc
Stream #0.1: Audio: aac, 44100 Hz, stereo, s16, 131 kb/s
Output #0, ffm, to ‘http://localhost:8090/feed1.ffm’:
Metadata:
encoder : Lavf52.64.2
Stream #0.0: Video: flv, yuv420p, 320x240, q=3-3, 5200 kb/s, 1000k tbn, 25 tbc
Stream mapping:
Stream #0.0 -> #0.0
Press [q] to stop encoding
[flv @ 0x9f78870]rc buffer underflow
frame= 30 fps= 0 q=2.0 size= 60kB time=1.20 bitrate= 409.6kbits/s dup=0 drop=5 frame= 48 fps= 44 q=2.0 size= 108kB time=1.92 bitrate= 460.8kbits/s dup=0 drop=8 frame= 59 fps= 37 q=2.0 size= 172kB time=2.36 bitrate= 597.0kbits/s dup=0 drop=11frame= 68 fps= 32 q=2.0 size= 228kB time=2.72 bitrate= 686.7kbits/s dup=0 drop=12frame= 78 fps= 29 q=40.6 size= 288kB time=3.12 bitrate= 756.2kbits/s dup=0 drop=1
.
.

[/code]

D’après ce que tu comptes faire, l’association de ffmpeg et ffserver semble un bon choix.

Comme tu l’as correctement fait, il faut :
Lancer ffserver,
Diffuser un flux de ffmpeg vers ffserver,
Te connecter au serveur web, lancé par ffserver, avec un client X.

Bizarre que ton ffserver ne voulait pas se lancer…
As tu essayer un autre port ?

:041 c’est bon ça marche, j’ai modifié le fichier FFserver.conf comme ci-dessous, mais le problème c’est que je visualise la vidéo qu’à partir du moment où je clique sur play de lecteur (VLC) mais le pire c’est que je ne peux la regarder qu’a la fin de l’encodage :unamused:

si je résume :
-démarrer le FFserver
-démarrer l’encodage : FFmpeg
-lancer la lecture de la vidéo avec VLC : localhost:8090/video.flv
-lecture en attente de la fin de l’encodage
-fin de l’encodage
-visualisation de la vidéo à partir du moment où j’ai cliqué sur play du lecteur VLC c’est à dire une vidéo de 120s si vous lancez la lecture après 30s vous aller regarder que les derniers 90s.

quelqu’un peut m’expliquer ça SVP :119 !!!

# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.
Port 8090

# Address on which the server is bound. Only useful if you have
# several network interfaces.
BindAddress 0.0.0.0

# Number of simultaneous requests that can be handled. Since FFServer
# is very fast, it is more likely that you will want to leave this high
# and use MaxBandwidth, below.
MaxClients 1000

# This the maximum amount of kbit/sec that you are prepared to
# consume when streaming to clients.
MaxBandwidth 1000

# Access log file (uses standard Apache log file format)
# '-' is the standard output.
CustomLog -

# Suppress that if you want to launch ffserver as a daemon.
NoDaemon

##################################################################
# Definition of the live feeds. Each live feed contains one video
# and/or audio sequence coming from an ffmpeg encoder or another
# ffserver. This sequence may be encoded simultaneously with several
# codecs at several resolutions.

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 1000K
ACL allow 127.0.0.1
</Feed>

##################################################################

 <Stream test.flv>
    Feed feed1.ffm
    Format flv
    VideoCodec flv
    VideoFrameRate 15
    VideoBufferSize 80000
    VideoBitRate 100
    VideoQMin 1
   VideoQMax 5
   VideoSize 352×288
    PreRoll 0
   Noaudio
</Stream>


<Stream stat.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255

#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico
</Stream>

merci snooker, au fait le problème s’était dans le fichier FFserver.conf, regardez mon dernier message.

toujours le même problème :confused:

visualisation de la vidéo à partir du moment où j’ai cliqué sur play du lecteur VLC c’est à dire une vidéo de 120s si vous lancez la lecture après 30s vous aller regarder que les derniers 90s.

pouvez vous m’expliquer ça SVP :119 !!!

Je n’ai jamais réalisé de système type VOD, comme tu souhaites le faire.
Je ne connais pas non plus ffserver en détail pour résoudre ton problème.

En revanche, rien ne t’empêche d’écrire ton serveur web qui te donne la liste des vidéos disponibles.
Lorsque le client choisit une vidéo, tu lance la diffusion avec un ffmpeg ou un vlc.

Oui exactement c’est ça ce que je cherche et voulais faire, un serveur web qui je donne la liste des vidéos disponibles.Lorsque le client choisit une vidéo, je lance la diffusion. mais franchement aucune idée sur le développement en langage C d’un serveur, vu que je suis d’origine un électronicien converti en informatique, donc vraiment un débutant en programmation.

Avez vous un exemple de serveur, le programme que vous avez déjà réalisé si ce n’est pas confidentiel ou une idée explicite sur l’algorithme.

Peut être je demande trop mais vraiment je voulais réussir mon premier stage :doh:
merci