Peut-ffmpeg brûler dans le code temporel?
J'ai besoin de graver dans le temps de code d'une vidéo et je me demande si c'est quelque chose que ffmpeg est capable de?
source d'informationauteur spinon
Vous devez vous connecter pour publier un commentaire.
Réponse courte, no.
Longue réponse, oui, mais pas sans l'aide d'une bibliothèque distincte pour créer des images avec un rendu du code de temps sur eux, avec la transparence remplir le reste de la trame, puis à l'aide de FFmpeg pour superposer les images sur la vidéo existante. Sur le dessus de ma tête, je ne sais pas comment faire cela, mais je suis sûr que si vous êtes créatif, vous pouvez le comprendre.
Edit: j'ai travaillé sur ce problème parce que c'est une question intéressante/projet pour moi. J'ai parcouru un peu plus loin dans la solution par écrit un script Perl qui va générer un
.srt
fichier avec le code temporel intégré dans celui-ci pour une vidéo donnée de fichier à partir de laquelle FFmpeg est configuré de manière à être capable de lire les métadonnées. Il utilise leVidéo::FFmpeg
bibliothèque pour lire la durée et enregistre un fichier de sous-titres comme${video}.srt
. Cela fera en sorte qu'il s'affiche automatiquement dans Mplayer si vous insérez les lignes suivantes dans votre~/.mplayer/config
:Encore à travailler sur la façon de position et de recouvrir le rendu des sous-titres sur une vidéo et ré-encoder dans le même format. Je vais mettre à jour ce post que je sais plus.
FFMPEG drawtext filtre fonctionne pour moi, vous spécifiez le code temporel de démarrage et son format ainsi:
vous devez spécifier le format du code temporel sous la forme hh:mm:ss[:;,]ff. Notez que vous devez vous échapper le deux-points dans le format du code temporel de la chaîne, et vous devez spécifier un code temporel taux (ici 25fps). Vous pouvez également spécifier d'autres texte - ici, c'est "TCR:"
Vous pouvez obtenir le taux de trame avec ffprobe et un peu de shell fu:
Donc, vous pouvez facilement brancher tous ensemble dans un traitement par lots (batch script, par exemple,
Qui permettrait d'ajouter le nom de l'élément et rolling code temporel dans une semi-opaque à cocher en bas au centre de 1920x1080 cadre
Modifier
Depuis que je suis arrivé à le côté sombre que je fais maintenant ce dans un environnement Windows Powershell, et c'est ce que j'utilise:
Cela crée mp4s donné un dossier contenant .MOV, .MP4 et .MTS fichiers (à l'aide de la
-filter
de commande, il cherche les fichiers avec *.M* dans le nom, vous aurez à changer si vous étiez en train de faire .Les fichiers AVI), et c'est un peu plus faible, il utilise juste libx264 avec les paramètres par défaut en sortie de codec et de ne pas spécifier la police etc. Le code temporel dans ce cas, est brûlé dans en haut à gauche de l'image.La drawtext filtre mentionné dans @la stib's réponse est la touche pour insérer le temps. À l'aide de la
timecode
option, cependant, ne correspond pas au temps horloge murale. Si vous obtenez ler
(timecode_rate) paramètre de mal, alors votre l'heure ne correspond pas à votre temps de lecture.D'autres options existent, par exemple la
text='%{prt}'
option vous permet d'afficher le temps écoulé avec une précision. Commande:Pour obtenir une horloge à la place, j'ai dû utiliser le obsolète
strftime
option. Cela a un sans-papiersbasetime
option qui peut être utilisée pour définir l'heure de début dans microsecondes. Un exemple où j'ai mis l'heure de départ 12:00 PM, le 1er décembre 2013 (la$(...)
partie shell-extension fait par le shell) et n'ont que le temps affiché (voir la strftime manuel pour les formats possibles):\\:
est utilisé pour échapper à la:
qui serait autrement d'obtenir la signification d'une option séparateur.Un autre exemple: une commande pour insérer la date + heure à l'intérieur d'une boîte noire, certains pixels à partir du haut à gauche et "rembourrage" (en fait, deux espaces et retours à la ligne sur les bords):
Un autre exemple, pour obtenir l'microsecondes au-dessous de l'horloge:
Il utilise le fait que le texte est en fait de trois lignes et que les deux ont un caractère de saut de ligne (retour chariot,
^M
) ajouté et ajouté. (Sans ce retour à la ligne, l'espace devient dépouillé)Autres conseils:
-vf
et-filter:v
sont égaux.-vf drawtext=text=1 -vf drawtext=text=2
ne fera qu'attirer le deuxième texte. Vous pouvez combiner des filtres avec une virgule comme je l'ai montré ci-dessus.dans les versions plus récentes, vous pouvez utiliser le drawtext filtre (le "t" dans ses exemples est, je crois, l'horodatage de l'image) pour insérer du texte. Il travaille également pour srtftime sur le "en cours" système de temps ainsi.
La solution la plus simple que j'ai trouvé pour afficher l'horloge lorsque le fichier a été capturé, et non de sa durée et de travail /sur la base de ce post, merci!/est
Si simple dans le code temporel - mettez votre heure de départ, puis le comptage se passe bien! L'exemple est pour Windows
Voici ma solution, et je crois que c'est le bon, car il évite d'avoir à régler manuellement le taux, et vous permet de formater la sortie.
Cela produit un timbre dans le format HH:MM:SS; vous pouvez le modifier comme vous le souhaitez, à l'aide de strftime.
Il peut sembler comme il va mettre dans un horodatage avec
gmtime
mais ce n'est pas ce qui se passe. Il en fait des flux de la vidéo actuelle de temps, en secondes, à gmtime, la production d'une date qui est 1/1/1970, et un temps qui est cependant de nombreuses secondes après minuit. Donc, vous venez de jeter la partie date et utiliser le temps de la partie.Prendre note de la triple échappé à deux points à l'intérieur de l'pts fonction, qui vous aurez à faire si vous entrez comme je l'ai fait ci-dessus. Aussi, vous pouvez voir que j'ai copié mon fichier de police de caractères Arial Gras et est tombé droit dans le répertoire de travail pour des raisons de simplicité.
FFMPEG sera en mesure de faire beaucoup de travail, mais ce ne sera pas du tout emballé. En utilisant FFMPEG, vous pouvez décoder toutes les trames de la séquence, et de vous donner le "Presentation Time Stamp" (temps supplémentaire métadonnées connexes peuvent être disponibles sur certains formats, mais le PTS est ce que vous aurez envie de chercher à obtenir commencé.) Alors, vous êtes sur votre propre pour réellement dessiner le texte sur la trame décodée vous-même. J'utilise Qt pour des choses similaires, en utilisant QPainter sur un QImage avec les données de la trame, mais il peut y avoir quelques autres API pour dessiner sur une image que vous trouvez de plus en plus évidents. Ensuite, utilisez la VERSION de l'API de faire une compression de la vidéo qui a nouvellement tiré sur les images. Ça va être un peu plus compliqué si vous aussi vous voulez audio. Mon travail n'est pas vraiment à propos de l'audio, donc je n'ai pas pris la peine d'apprendre les aspects audio de l'API. En gros, si vous faites de votre lecture en boucle d'obtenir des paquets de la file, certains d'entre eux seront audio. Au lieu de se débarrasser d'eux comme je le fais, vous aurez besoin de les conserver et de les écrire dans le fichier de sortie que vous avez.
Je ne l'ai utilisé l'API C, plutôt qu'en C#, donc je ne sais pas si il y a des gotcha il y a à s'inquiéter.