FFMPEG - DTS ที่ไม่จำเจ


15

เมื่อฉันใช้ FFMPEG เพื่อแปลงวิดีโอจาก MP4 เป็น M3U8 โดยใช้คำสั่งต่อไปนี้

ffmpeg -i op.mp4  -b:v 128k -flags -global_header -map 0:0 -map 0:1 -f segment -segment_time 4 -segment_list_size 0 -segment_list op.m3u8 -segment_format mpegts op%05d.ts

ฉันได้รับคำเตือนด้านล่าง:

Non-monotonous DTS in output stream 0:1; previous: 347527, current: 346508; changing to 347528. This may result in incorrect timestamps in the output file.

M3U8 นั้นถูกสร้างขึ้น แต่มีเพียงเสียงที่จะปรากฏในเครื่องเล่น QuickTime เท่านั้น

ทั้ง MP4 ตัวอย่างและ M3U8 มีให้บริการที่นี่

ฉันอยากรู้

  1. เหตุผลที่อยู่เบื้องหลังข้อผิดพลาดนี้ มันเป็น mp4 หรือปัญหาที่เสียหายในระหว่างการแปลง m3u8 สามารถเล่นได้ไม่สามารถเล่นได้อย่างรวดเร็ว เสียงขึ้นมาเท่านั้นไม่มีวิดีโอ

  2. ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

ทำเอาต์พุตคอนโซล FFMPEG ให้สมบูรณ์:

ffmpeg version git-2013-06-06-c51654f Copyright (c) 2000-2013 the FFmpeg developers
  built on Jun  6 2013 12:54:24 with gcc 4.6.3 (GCC) 20120306 (Red Hat 4.6.3-2)
  configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264
  libavutil      52. 35.100 / 52. 35.100
  libavcodec     55. 15.100 / 55. 15.100
  libavformat    55.  8.102 / 55.  8.102
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 75.101 /  3. 75.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'op.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.8.102
  Duration: 00:00:06.00, start: 0.010000, bitrate: 679 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 640x364 [SAR 1:1 DAR 160:91], 590 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 130 kb/s
    Metadata:
      handler_name    : SoundHandler
[segment @ 0x32e1d60] Codec for stream 0 does not use global headers but container format requires global headers
[segment @ 0x32e1d60] Codec for stream 1 does not use global headers but container format requires global headers
Output #0, segment, to 'op%05d.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.8.102
    Stream #0:0(eng): Video: mpeg2video, yuv420p, 640x364 [SAR 1:1 DAR 160:91], q=2-31, 128 kb/s, 90k tbn, 25 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg2video)
  Stream #0:1 -> #0:1 (aac -> mp2)
Press [q] to stop, [?] for help
[segment @ 0x32e1d60] Non-monotonous DTS in output stream 0:1; previous: 347527, current: 346508; changing to 347528. This may result in incorrect timestamps in the output file.
frame=  109 fps=0.0 q=31.0 size=N/A time=00:00:04.29 bitrate=N/A dup=14 drop=0  frame=  151 fps=0.0 q=24.8 Lsize=N/A time=00:00:06.00 bitrate=N/A dup=14 drop=0    
video:350kB audio:96kB subtitle:0 global headers:0kB muxing overhead -100.004823%

ด้วยตัวเลือก vsync และ async ข้อผิดพลาดที่ปรากฏคือ "Codec for stream 0 ไม่ได้ใช้ส่วนหัวร่วม แต่รูปแบบคอนเทนเนอร์ต้องใช้ส่วนหัวร่วม" นี่คือเอาต์พุตคอนโซล:

ffmpeg -i op.mp4  -b:v 128k -flags -global_header -map 0:0 -map 0:1 -f segment -segment_time 4 -segment_list_size 0 -segment_list nop.m3u8 -segment_format mpegts nop%05d.ts  
ffmpeg version git-2013-06-06-c51654f Copyright (c) 2000-2013 the FFmpeg developers
  built on Jun  6 2013 12:54:24 with gcc 4.6.3 (GCC) 20120306 (Red Hat 4.6.3-2)
  configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264
  libavutil      52. 35.100 / 52. 35.100
  libavcodec     55. 15.100 / 55. 15.100
  libavformat    55.  8.102 / 55.  8.102
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 75.101 /  3. 75.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'op.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.8.102
  Duration: 00:00:06.00, start: 0.010000, bitrate: 679 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 640x364 [SAR 1:1 DAR 160:91], 590 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 130 kb/s
    Metadata:
      handler_name    : SoundHandler
[segment @ 0x3bf3d60] Codec for stream 0 does not use global headers but container format requires global headers
[segment @ 0x3bf3d60] Codec for stream 1 does not use global headers but container format requires global headers
Output #0, segment, to 'nop%05d.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.8.102
    Stream #0:0(eng): Video: mpeg2video, yuv420p, 640x364 [SAR 1:1 DAR 160:91], q=2-31, 128 kb/s, 90k tbn, 25 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg2video)
  Stream #0:1 -> #0:1 (aac -> mp2)
Press [q] to stop, [?] for help
[segment @ 0x3bf3d60] Non-monotonous DTS in output stream 0:1; previous: 347527, current: 346508; changing to 347528. This may result in incorrect timestamps in the output file.
frame=  119 fps=0.0 q=31.0 size=N/A time=00:00:04.68 bitrate=N/A dup=14 drop=0  frame=  151 fps=0.0 q=24.8 Lsize=N/A time=00:00:06.00 bitrate=N/A dup=14 drop=0    
video:350kB audio:96kB subtitle:0 global headers:0kB muxing overhead -100.004823%

โปรดรวมเอาท์พุทคอนโซล ffmpeg ที่สมบูรณ์
llogan

แก้ไขเพื่อเพิ่มเอาต์พุตคอนโซล ffmpeg ที่สมบูรณ์
Divya Bhargov

จะเกิดอะไรขึ้นถ้าคุณเพิ่มพารามิเตอร์-vsync 1 -async 1?
harrymc

1
ฉันไม่เข้าใจว่าคุณกำลังพยายามทำอะไร M3U8 เป็นข้อกำหนดของเพลย์ลิสต์ไม่ใช่รูปแบบวิดีโอ โปรดระบุรายละเอียดเพิ่มเติมเกี่ยวกับกรณีการใช้งานที่คุณต้องการ
MrDrMcCoy

2
มีคนอยู่ 5 คนบนโลกใบนี้ที่รู้คำตอบ ...
bodacydo

คำตอบ:


1

คลิป CSI ของคุณถูกแปลงด้วยข้อความ DTS ที่ไม่ซ้ำซากจำเจเช่นกัน ฉันสามารถเล่นคลิป MP4 ได้ดีใน VLC แต่ ffplay สะดุดในตอนท้าย ฉันไม่แน่ใจว่ามันหมายถึงอะไร

ffmpeg -i op.mp4 -b:v 128k -flags -global_header -map 0:0 -map 0:1 -f segment -segment_time 4 -segment_list_size 0 -segment_list op.m3u8 -segment_format mpegts op%05d.ts

เพิ่งได้รับรุ่นที่ใหม่กว่าffmpeg ของคุณคือตั้งแต่มิถุนายน 2013 เหมืองจากมีนาคม 2014 ทำงานได้ดี mp4 เล่นได้ดีสำหรับฉันบน VLC ไฟล์. tts แต่ละรายการก็โอเคสำหรับฉันเช่นกัน

C:\temp>dir op*
 Volume in drive C has no label.
 Volume Serial Number is xxx-xxx

 Directory of C:\temp

10/07/2014  08:52 PM               169 op.m3u8
10/07/2014  08:51 PM           509,425 op.mp4
10/07/2014  08:52 PM           404,764 op00000.ts
10/07/2014  08:52 PM           148,520 op00001.ts
               4 File(s)      1,062,878 bytes

op.m3u8 สร้างเซ็กเมนต์โดยเพิ่มขึ้น 4 วินาทีจนกว่าไฟล์จะถูกประมวลผลอย่างสมบูรณ์

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:5
#EXTINF:4.120000,
op00000.ts
#EXTINF:1.960000,
op00001.ts
#EXT-X-ENDLIST

1

mp4 นั้นมีความยาวเพียง 6 วินาทีและกระแสเสียงนั้นมีความยาวแตกต่างจากวิดีโอฉันสามารถซิงค์ทั้งสองและกำจัดข้อผิดพลาด DTS ได้โดยทำสิ่งต่อไปนี้:

ffmpeg -i op.mp4 -ss 00:00:00.11 -t 00:00:06.00 -vn -y op.wav

ffmpeg -i op.mp4 -ss 0.010000 -t 00:00:06 -vcodec rawvideo -an -y op.avi

ffmpeg -i op.avi -i op.wav -b:v 590k -b:a 130k -t 00:00:06 -y op_fixed.mp4

สิ่งนี้จะสร้าง mp4 ขึ้นใหม่และแก้ไขปัญหาความเสียหายเล็กน้อยในขณะที่ทำให้ทั้งสองสตรีมมีความยาวเท่ากัน

นอกจากนี้บรรทัดคำสั่งของคุณไม่จำเป็นต้องมีพารามิเตอร์สองแผนที่และตัวแปลงสัญญาณจาก mp4 ต้นฉบับไม่สนับสนุนส่วนหัวร่วมทั่วโลกนอกจากนี้ฉันไม่คิดว่าคุณต้องการมันอยู่ดี สิ่งต่อไปนี้ควรเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาดหลังจากทำตามขั้นตอนที่ฉันระบุไว้ด้านบน:

ffmpeg -i op_fixed.mp4 -b:v 128k -f segment -segment_time 4 -segment_list_size 0 -segment_list op.m3u8 -segment_format mpegts op%05d.ts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.