2017-06-26 2 views
7
transcoder

Je suis en train de transcoder 360 Vidéo en utilisant ffmpeg (pour jouer sur les engins VR, pour l'instant), principalement pour réduire le débit (ce qui est une exigence). Mais le fichier de sortie semble supprimer les "données secondaires" qui ont les métadonnées vidéo 360.préservation Side informations données pour 360 vidéo en utilisant FFmpeg

fichier d'entrée résultat ffprobe (note de la section de données latérale):

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': 
Metadata: 
major_brand  : mp42 
minor_version : 0 
compatible_brands: mp42mp41 
creation_time : 2016-10-28T10:41:42.000000Z 
Duration: 00:02:09.56, start: 0.000000, bitrate: 20116 kb/s 
Stream #0:0(eng): Video: h264 (Main) (avc1/0x31637661), yuv420p(tv, bt709), 2560x1280, 19797 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default) 
Metadata: 
    creation_time : 2016-10-28T10:41:42.000000Z 
    handler_name : Alias Data Handler 
    encoder   : AVC Coding 
Side data: 
    spherical: equirectangular (0.000000/0.000000/0.000000) 
Stream #0:1(eng): Audio: aac (LC) (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default) 
Metadata: 
    creation_time : 2016-10-28T10:41:42.000000Z 
    handler_name : Alias Data Handler 

Les commandes ont essayé de transcoder (valeurs de débit et de présélection ne sont que pour les tests):

ffmpeg -i <input_file_name> -vf scale=2560x1280,setdar=16:9 -r 30 -c:v libx264 -b:v 500k -pix_fmt yuv420p -preset ultrafast -c:a aac -b:a 192K -map_metadata 0:s:v:0 -write_id3v2 1 -y test.mp4 
ffmpeg -i <input_file_name> -vf scale=2560x1280,setdar=16:9 -r 30 -c:v libx264 -b:v 500k -pix_fmt yuv420p -preset ultrafast -c:a aac -b:a 192K -map_metadata 0:s -y test.mp4 
ffmpeg -i <input_file_name> -vf scale=2560x1280,setdar=16:9 -r 30 -c:v libx264 -b:v 500k -pix_fmt yuv420p -preset ultrafast -c:a aac -b:a 192K -map_metadata 0 -y test.mp4 
ffmpeg -i <input_file_name> -vf scale=2560x1280,setdar=16:9 -r 30 -c:v libx264 -b:v 500k -pix_fmt yuv420p -preset ultrafast -c:a aac -b:a 192K -y test.mp4 

Dans chaque cas, la ffprobe test.mp4 semble montrer la section "Side Data" manquante:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4': 
Metadata: 
major_brand  : isom 
minor_version : 512 
compatible_brands: isomiso2avc1mp41 
creation_time : 2016-10-28T10:41:42.000000Z 
encoder   : Lavf57.71.100 
Duration: 00:02:09.57, start: 0.000000, bitrate: 708 kb/s 
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 2560x1280 [SAR 8:9 DAR 16:9], 507 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default) 
Metadata: 
    creation_time : 2016-10-28T10:41:42.000000Z 
    handler_name : VideoHandler 
Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 193 kb/s (default) 
Metadata: 
    creation_time : 2016-10-28T10:41:42.000000Z 
    handler_name : SoundHandler 

Toute aide ou des conseils pour obtenir ffmpeg pour préserver les données secondaires seraient appréciés

+0

Est-ce que '-fflags keepside' fonctionne comme indicateur d'entrée ou de sortie? – Mulvya

+0

@Mulvya merci, je l'ai essayé maintenant comme drapeau d'entrée et de sortie mais la ffprobe de la sortie est toujours la même (sans la section Données latérales). 'ffmpeg -fflags keepside -i .....' et 'ffmpeg -i input.mp4 -vf ..... -fflags keepside -y test.mp4' – Icareus

+0

@ jeffcook2150 Avez-vous un court exemple de fichier d'entrée que vous peut partager? – LordNeckbeard

Répondre

2

Ces dernières ffmpeg versions les données du côté des paquets spherical est pris en charge mais écrire dans MP4 vous devez définir le mode standard de conformité à unnoficial ou experimental:

ffmpeg -i R0010309_er.MP4 -c copy -strict unofficial spherical.mp4 

ffprobe spherical.mp4 2>&1 | grep -A1 Side 
Side data: 
    spherical: equirectangular (0.000000/0.000000/0.000000) 

Le code correspondant dans libavformat/movenc.c fonction mov_write_video_tag:

if (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { 
     AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL); 
     AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL); 

     if (stereo_3d) 
      mov_write_st3d_tag(pb, stereo_3d); 
     if (spherical_mapping) 
      mov_write_sv3d_tag(mov->fc, pb, spherical_mapping); 
    } 
+0

Merci! J'ai essayé ceci avec une construction git aussi mais il me manquait le '-strict officieux'. On dirait que c'est supporté depuis ffmpeg 3.3. – jeffcook2150

+0

@ jeffcook2150 De rien. S'il vous plaît noter que si vous jamais remux à un autre format (comme Matroska), vous n'avez pas besoin de l'option de conformité. – aergistal