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は再生可能ですが、quicktimeでは正しく再生できません。オーディオのみが表示され、ビデオは表示されません。

  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オプションを使用すると、表示されるエラーは「ストリーム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 14年

2
そこ...その答えを知っているこの地球上の5人のようなもの
bodacydo

回答:


1

CSIクリップも非単調なDTSメッセージで変換されます。VLCでMP4クリップを再生できましたが、最後に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年6月からです。2014年3月からの鉱山はうまくいきました。VLCではmp4が正常に再生されます。個々の.tsファイルも同様に問題なく再生されました。

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秒で、オーディオストリームの長さはビデオとは異なりますが、次の操作を行うことで2つを同期し、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を再作成し、両方のストリームの長さを同じにしている間にいくつかの小さな破損の問題を修正します。

また、コマンドラインは2つの-mapパラメーターを必要としません。また、元の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.