Couper et fusionner la vidéo H264 de la caméra donne un fichier corrompu

0

Je ne suis pas sûr du problème avec la vidéo spécifique ou des commandes incorrectes. J'ai testé avec la dernière version de ffmpeg 04/04/2016 et l'ancienne version 2.8.6. Le fichier Sample.avi est enregistré par une caméra PTZ.

Pour couper et fusionner un fichier vidéo, j'ai utilisé les commandes de ce post .

# skip 30 seconds and re-mux a 60 seconds segment
ffmpeg -ss 30 -t 60 -i D:\VideoCutting\Sample.avi -c:v copy -c:a copy -bsf:v h264_mp4toannexb D:\VideoCutting\Segment1.ts

# skip 3600 seconds and re-mux a 60 seconds segment
ffmpeg -ss 3600 -t 60 -i D:\VideoCutting\Sample.avi -c:v copy -c:a copy -bsf:v h264_mp4toannexb D:\VideoCutting\Segment2.ts

Le résultat:

Input #0, avi, from 'D:\VideoCutting\Sample.avi':
  Duration: 06:05:07.14, start: 0.000000, bitrate: 2479 kb/s
    Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2476 kb/s, 14.98 fps, 14.99 tbr, 14.98 tbn, 59.94 tbc
Output #0, mpegts, to 'D:\VideoCutting\Segment1.ts':
  Metadata:
    encoder         : Lavf57.29.101
    Stream #0:0: Video: h264 (H264 / 0x34363248), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 2476 kb/s, 14.98 fps, 14.99 tbr, 90k tbn, 14.98 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)

Erreur:

[NULL @ 05149480] Packet header is not contained in global extradata, corrupted stream or invalid MP4/AVCC bitstream
[NULL @ 05149480] Failed to open bitstream filter h264_mp4toannexb for stream 0 with codec copy: Invalid argument
[mpegts @ 051c8420] Timestamps are unset in a packet for stream 0. This is depre cated and will stop working in the future. Fix your code to set the timestamps properly

Les segments vidéo ont été créés et sont lisibles.

Cependant, lorsque je rejoins les segments, la vidéo fusionnée n'est plus lisible:

# merge the segments and re-mux them as mp4
ffmpeg -i "concat:D:\VideoCutting\Segment1.ts|D:\VideoCutting\Segment2.ts" -c:v copy -c:a copy -movflags empty_moov -flags global_header -bsf:v dump_extra Merged.mp4

Résultat:

Input #0, mpegts, from 'concat:D:\VideoCutting\Segment1.ts|D:\VideoCutting\Segme
nt2.ts':
  Duration: 00:01:00.15, start: 1.400000, bitrate: 7610 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 19
20x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 14.99 tbr, 90k tbn, 59.94 tbc
Output #0, mp4, to 'Merged.mp4':
  Metadata:
    encoder         : Lavf57.29.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1
:1 DAR 16:9], q=2-31, 29.97 fps, 14.99 tbr, 90k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mpegts @ 0003ca60] DTS 126000 < 5539218 out of order
frame= 1803 fps=0.0 q=-1.0 Lsize=   51655kB time=00:02:00.26 bitrate=3518.7kbits
/s speed= 601x
video:51633kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing
 overhead: 0.042451%

Erreur: [mpegts @ 0003ca60] DTS 126000 <5539218 en panne

D’autres publications, je peux deviner que le problème vient du fichier vidéo qui n’est pas correctement formaté. Puis-je le couper et le fusionner sans ré-encoder ou dois-je d'abord réparer le fichier vidéo?

J Pollack
la source

Réponses:

0

Donc, vous avez H.264 dans AVI et vous avez l’impression que le filtre de flux binaire H.264 n’est pas conçu pour cela.

Utilisez ceci pour générer les segments:

# skip 30 seconds and re-mux a 60 seconds segment
ffmpeg -ss 30 -t 60 -i D:\VideoCutting\Sample.avi -c copy -avoid_negative_ts make_zero -fflags +genpts D:\VideoCutting\Segment1.ts

Et puis fusionner des segments

ffmpeg -i "concat:D:\VideoCutting\Segment1.ts|D:\VideoCutting\Segment2.ts" -c copy -flags +global_header -fflags +genpts Merged.mp4
Gyan
la source
Ça y est ...! C'est ce qui fonctionne pour moi. Comment avez-vous su le faire? Pourriez-vous s'il vous plaît expliquer un peu plus pour la prochaine fois que je pourrais venir à la solution par moi-même?
J Pollack
Juste pour info, j'ai toujours l'avertissement d'horodatage et [mpegts @ 02ecc9a0] DTS 126000 <5539218 en panne [mpegts @ 02ecc9a0] DTS 126000 <5533210 en panne. Pourriez-vous s'il vous plaît les expliquer aussi?
J Pollack
Cette coupe et fusion est rapide. Juste un clin d'œil! BTW fonctionne-t-il également avec la vidéo avec l'audio? Je ne peux pas tester car j'ai actuellement des vidéos muettes ...
J Pollack