JavaCV FFmpegFrameRecorder propriétés explication nécessaire
Je suis en utilisant FFmpegFrameRecorder
pour obtenir l'entrée vidéo de ma webcam et de les enregistrer dans un fichier vidéo. Le problème est que je suis en train de construire mon application en utilisant un peu différent de la démo codes sources que j'ai trouvé et j'utilise les propriétés de certains ne sont pas complètement clair pour moi.
Tout d'abord, voici mon extrait de code :
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILENAME, grabber.getImageWidth(),grabber.getImageHeight());
recorder.setVideoCodec(13);
recorder.setFormat("mp4");
recorder.setPixelFormat(avutil.PIX_FMT_YUV420P);
recorder.setFrameRate(30);
recorder.setVideoBitrate(10 * 1024 * 1024);
recorder.start();
- setVideoCodec(13) - Quel est le sens de cette
(13)
comment puis-je comprendre ce réel codec se trouve derrière n'importe quel nombre? - setPixelFormat - Juste obtenir cela, ne pas savoir ce qu'elle fait en général
- setFrameRate(30) - je pense que cela devrait être assez clair, mais encore quelle est la logique derrière ce cadre, nous avons choisi (n'est-ce pas le haut de la meilleure?)
- setVideoBitrate(10*1024*1024) de nouveau presque aucune idée de ce que cela fait, et quelle est la logique derrière ces chiffres?
À la fin, je veux juste mentionner un dernier problème que je reçois de l'enregistrement vidéo de ce genre. Si la longueur réelle de la vidéo est disons 20secs. Quand j'ai jouer le fichier vidéo créé à partir du programme, il fonctionne beaucoup plus rapidement. Peut pas dire si c'est exactement 2 fois plus vite qu'elle ne devrait l'être, mais en général, si j'enregistre un 20sec vidéo, puis il est joué pendant environ 10secs. Ce qui peut provoquer cela et comment puis-je résoudre ce problème?
OriginalL'auteur Leron | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
VideoCodec peut être choisi à partir de cette liste qui se trouve dans
avcodec.h
/avcodec.java
(Comme vous pouvez le voir, le numéro 13 de nous MPEG4, et il en existe d'autres, mais FFmpeg n'est pas un encodeur pour tous):PixelFormat peut être sélectionné à partir de cette liste dans
pixfmt.h
/avutil.java
, mais chaque codec supporte seulement quelques-uns d'entre eux (la plupart d'entre eux prennent en charge au moinsAV_PIX_FMT_YUV420P
):FrameRate indique le nombre d'images par seconde de la vidéo doit être lu à (il n'a rien à voir avec le nombre ou la cadence d'images à enregistrer, mais il fournit une base pour le débit d'encodage). Ainsi, dans le cas de 30 FPS, pour couvrir les 20 secondes de la vidéo, vous devez appeler
record()
30 * 20 = 600 fois. Si vous n'avez pas d'appelrecord()
600 fois, puis c'est la cause de votre problème.VideoBitrate fournit le débit vidéo (en bits par seconde) à laquelle le flux vidéo doit être encodé. Wikipédia a un bel article à ce sujet.
Bien sûr! BTW, certains codecs (FLV1 et MPEG4 peut-être?) soutien vitesses variables, nous obtenons lors de l'appel de
setTimestamp(playbackTimeInMicroseconds)
avant chaquerecord(image)
. Qui peut aider quand il n'est pas possible de parvenir à un équilibre taux de trame pour quelque raison que ce soit.Salut merveilleux explication.Pouvez-vous décrire à propos de timestamp mécanisme.Comment définir timestamp votre vidéo dans FFmpegFrameRecorder?
Il y a un exemple de cela dans le RecordActivity.java de l'échantillon. Que devraient se préciser un peu les choses concernant les horodatages.
J'ai déjà vu en Fait dans mon cas audio vient plus vite que l'image vidéo.J'ai posté ce coup d'oeil et de me suggérer ce qui est mauvais .Merci stackoverflow.com/questions/22342732/...
OriginalL'auteur Samuel Audet