Le format de la vidéo découpée en tranches avec FFmpeg change involontairement

1

J'essaie d'extraire une petite partie d'une vidéo plus grande sans changer les codecs, la résolution ou autre chose. Par conséquent, j'utilise FFmpeg avec les paramètres suivants.

ffmpeg -vcodec copy -acodec copy -ss 01:00:00 -t 00:00:30 -metadata title="Custom title" -metadata artist="Artist Name" -metadata language="English" -i input_file_h264.mp4 output_file.mp4

Je traite la vidéo sur Ubuntu 10.10. avec FFmpeg version 0.6-4: 0.6-2ubuntu6.2.

Le fichier de sortie contient les mêmes informations de codec que le fichier d'entrée. Bien que, il ouvre dans VLC et autre lecteur multimédia comme si la résolution de la vidéo changeait . La source d'entrée est livrée avec une résolution de 720x576. Le codec utilisé est H264 - MPEG-4 AVC (partie 10) (avc1). Lorsque la sortie vidéo s'ouvre semble plus large (16: 9) bien que les paramètres vidéo ne soient pas modifiés.
Je n'ai rien trouvé de tel que le format d'image mal configuré dans VLC également.

Connaissez-vous un problème avec H264 sur Ubuntu? Autant que je sache, libx264 est utilisé. Mais est-ce pertinent lorsque je découpe une vidéo en tranches?


Comme suggéré par slhck, j'ai changé l'ordre des arguments.

ffmpeg -ss 01:00:00 -i 28c3-4906-en-lightning_talks_day_3_pecha_kucha_h264.mp4 -vcodec copy -acodec copy -t 00:00:30 output_file_slhck.mp4
JJD
la source
1
Je ne peux pas reproduire l'erreur. Cela fonctionne sans problèmes pour moi. Veuillez mettre à jour à FFmpeg 0.9 ou plus récent en tant que expliqué ici et essayez à nouveau. Ça devrait marcher.
slhck
J'ai mis à jour FFmpeg et utilisé l'ordre des arguments comme vous l'avez suggéré. Maintenant cela fonctionne parfaitement! Je vous remercie!
JJD
Heureux d'avoir pu aider!
slhck

Réponses:

2

Vous ne copiez pas vraiment le flux vidéo.

Fournir le acodec et vcodec options après la i option. Pensez simplement à la façon dont vous les traiteriez. Commencez par lire le fichier, puis décidez comment encoder, puis affichez-le. Si vous ne le faites pas, les options seront analysées différemment 1 , ce qui expliquerait la différence entre entrée et sortie en fonction de votre journal:

Input:  Stream #0.0(und): Video: h264, yuv420p, 720x576 [PAR 64:45 DAR 16:9]
Output: Stream #0.0(und): Video: libx264, yuv420p, 720x576 [PAR 89:44 DAR 445:176]

Notez la différence de format d'image (PAR)? Actuellement, vous essayez de décoder la vidéo avec le copy codec, qui n'existe évidemment pas. Le placement des options dans FFmpeg est parfois très important. 2

C’est aussi ce que dit le manuel:

Sélectionnez un encodeur (lorsqu'il est utilisé avant un fichier de sortie) ou un décodeur (lorsqu'il est utilisé avant un fichier d'entrée) pour un ou plusieurs flux

Donc, pour résumer - métadonnées laissées de côté pour la lisibilité

ffmpeg -ss 01:00:00 -i input_file_h264.mp4 -vcodec copy -acodec copy -t 00:06:00 output_file.mp4

1 - Avec les versions plus récentes de FFmpeg, la commande aurait échoué car un copy le décodeur n'existe pas.

2 - Placez également le t option après le processus de codage, et laisser ss au début. En mettant ss au début, veille à ce que le fichier soit lu jusqu'au moment voulu, puis commence à encoder. Si vous deviez placer ss après i, qui encoderait le fichier depuis le début, ce qui pourrait prendre beaucoup de temps.

slhck
la source
Désolé, ça ne marche pas. De plus, cela serait très mauvais si FFmpeg n'optimisait pas l'ordre des paramètres.
JJD
@JJD L'ordre des paramètres Est-ce que matière. Ce n'est tout simplement pas très évident dans le manuel. Avec FFmpeg 0.9, placer le vcodec ou acodec options avant i résultats dans le Unknown decoder 'copy' erreur parce qu'il essaie de décoder le fichier d'entrée avec cela, pas encoder le fichier de sortie. Veuillez mettre à jour votre version de FFmpeg et réessayer!
slhck
Je m'attendais à ce que le rapport de format ne change pas car je ne l'ai pas configuré pour le faire. N'y a-t-il aucun moyen de forcer FFmpeg à conserver les proportions? - Je ne veux pas vous offenser, mais le fait de devoir mettre les arguments dans un certain ordre est très hostile.
JJD
1
Je regarde dedans. Quoi qu’il en soit, vous devez les mettre dans un ordre différent car le sens change . Les placer avant signifie que vous voulez forcer un certain décodeur pour la vidéo d'entrée, alors que les placer après signifie que vous voulez forcer un certain encodeur pour la vidéo de sortie. Voir dans le manuel de FFmpeg sous le -codec option: & gt; Sélectionnez un encodeur (lorsqu'il est utilisé avant un fichier de sortie) ou un décodeur (lorsqu'il est utilisé avant un fichier d'entrée) pour un ou plusieurs flux .
slhck
En ce qui concerne les proportions: si vous utilisez vcodec copy à la bonne position, la vidéo (et son rapport de format) devrait rester intacte. Si vous avez toujours des problèmes, veuillez annexer le résultat de la nouvelle commande à votre question. Vous pouvez ajuster manuellement le rapport de format avec le -aspect option (voir le manuel d'utilisation).
slhck