2012-07-16 60 views
2

我試圖對HTS實時流式視頻進行編碼,但是在使用Apple Media Validator(mediastreamvalidator)驗證流時遇到了問題。 (我的測試文件:http://dominicansinteractive.idoms.org/media/9536/playlist.m3u8使用FFMPEG進行HLS編碼導致DTS下降

輸出是:

-------------------------------------------------------------------------------- 
http://dominicansinteractive.idoms.org/media/9536/199/prog_index.m3u8 
-------------------------------------------------------------------------------- 

Playlist Validation: 

    OK 

Segments: 

segment_00000.ts: 

    ERROR: (-1) Decreasing DTS were detected in track 0 
    ERROR: (-1) Decreasing DTS were detected in track 1 

    Average segment duration: 8.07 seconds 
    Average segment bitrate: 2155094.67 bps 
    Average segment structural overhead: 206525.83 bps (9.58 %) 

第二段似乎並不有問題:

[mpegts @ 0x1d78120] Format mpegts probed with size=2048 and score=100 
[mpegts @ 0x1d78120] stream=0 stream_type=1b pid=100 prog_reg_desc= 
[mpegts @ 0x1d78120] stream=1 stream_type=f pid=101 prog_reg_desc= 
[mpegts @ 0x1d78120] File position before avformat_find_stream_info() is 0 
[h264 @ 0x1d7c1c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[h264 @ 0x1d7c1c0] no picture 
[h264 @ 0x1d7c1c0] Current profile doesn't provide more RBSP data in PPS, skipping 
    Last message repeated 3 times 
[mpegts @ 0x1d78120] max_analyze_duration 5000000 reached at 5013333 
[mpegts @ 0x1d78120] File position after avformat_find_stream_info() is 0 

這似乎對於HLS來說是一個嚴重的問題,所以我在尋找是否有辦法解決這個問題。

當在編碼的文件,我得到(在電子郵件的底部編碼器輸出/命令)與FFmpeg中尋找:

ffmpeg -loglevel 99 -i encoded.ts 
ffmpeg version N-37783-gdf3a96c Copyright (c) 2000-2012 the FFmpeg developers 
built on Jul 4 2012 07:44:52 with gcc 4.4.5 
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libfaac --enable-nonfree 
libavutil  51. 63.100/51. 63.100 
libavcodec  54. 32.100/54. 32.100 
libavformat 54. 14.100/54. 14.100 
libavdevice 54. 0.100/54. 0.100 
libavfilter  3. 0.101/3. 0.101 
libswscale  2. 1.100/2. 1.100 
libswresample 0. 15.100/0. 15.100 
libpostproc 52. 0.100/52. 0.100 
[mpegts @ 0x2023120] Format mpegts probed with size=2048 and score=100 
[mpegts @ 0x2023120] stream=0 stream_type=1b pid=100 prog_reg_desc= 
[mpegts @ 0x2023120] stream=1 stream_type=f pid=101 prog_reg_desc= 
[mpegts @ 0x2023120] File position before avformat_find_stream_info() is 0 
[h264 @ 0x20271c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[h264 @ 0x20271c0] no picture 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 143280 in que 
    Last message repeated 6 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 158640 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 175920 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 193200 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 210480 in que 
    Last message repeated 7 times 
[h264 @ 0x20271c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 227760 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 245040 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 262320 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 279600 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 296880 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 314160 in que 
    Last message repeated 7 times 
[h264 @ 0x20271c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 331440 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 348720 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 366000 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 383280 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 400560 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 417840 in que 
    Last message repeated 6 times 
[h264 @ 0x20271c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 433200 in que 
    Last message repeated 6 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 448560 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 465840 in que 
    Last message repeated 6 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 481200 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 498480 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 515760 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 533040 in que 
    Last message repeated 6 times 
[h264 @ 0x20271c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[mpegts @ 0x2023120] first_dts 124080 not matching first dts 548400 in que 
    Last message repeated 7 times 
[mpegts @ 0x2023120] max_analyze_duration 5000000 reached at 5000000 
[mpegts @ 0x2023120] File position after avformat_find_stream_info() is 0 

And when at the first segmented file: 
ffmpeg -loglevel 99 -i segment_00000.ts 
ffmpeg version N-37783-gdf3a96c Copyright (c) 2000-2012 the FFmpeg developers 
built on Jul 4 2012 07:44:52 with gcc 4.4.5 
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libfaac --enable-nonfree 
libavutil  51. 63.100/51. 63.100 
libavcodec  54. 32.100/54. 32.100 
libavformat 54. 14.100/54. 14.100 
libavdevice 54. 0.100/54. 0.100 
libavfilter  3. 0.101/3. 0.101 
libswscale  2. 1.100/2. 1.100 
libswresample 0. 15.100/0. 15.100 
libpostproc 52. 0.100/52. 0.100 
[mpegts @ 0x1a0b120] Format mpegts probed with size=2048 and score=100 
[mpegts @ 0x1a0b120] stream=0 stream_type=1b pid=100 prog_reg_desc= 
[mpegts @ 0x1a0b120] stream=1 stream_type=f pid=101 prog_reg_desc= 
[mpegts @ 0x1a0b120] File position before avformat_find_stream_info() is 0 
[mpegts @ 0x1a0b120] Invalid timestamps stream=0, pts=1920, dts=8589929312, size=2355 
[mpegts @ 0x1a0b120] Invalid timestamps stream=0, pts=16320, dts=8589932912, size=3203 
[h264 @ 0x1a0f1c0] Current profile doesn't provide more RBSP data in PPS, skipping 
[h264 @ 0x1a0f1c0] no picture 
[h264 @ 0x1a0f1c0] Current profile doesn't provide more RBSP data in PPS, skipping 
    Last message repeated 3 times 
[mpegts @ 0x1a0b120] max_analyze_duration 5000000 reached at 5013333 
[mpegts @ 0x1a0b120] File position after avformat_find_stream_info() is 0 

不與Baseline Profile的會出現此問題,但主要做。

我使用的編碼的命令是:

ffmpeg, -i, [path]/test.mov, -y, -f, mpegts, -acodec, aac, -strict, -2, -ar, 48000, -b:a, 128000, -s, 960x540, -vcodec, libx264, -b:v, 1200000, -aspect, 960:540, -r, 25, -level, 3.1, -vprofile, main, -flags, +loop, -cmp, +chroma, -partitions, +parti4x4+partp8x8+partb8x8, -subq, 5, -trellis, 1, -refs, 1, -coder, 0, -me_range, 16, -keyint_min, 25, -sc_threshold, 40, -i_qfactor, 0.71, -bt, 200k, -maxrate, 1200000, -bufsize, 1200000, -rc_eq, 'blurCplx^(1-qComp)', -qcomp, 0.6, -qmin, 10, -qmax, 51, -qdiff, 4, -level, 30, -g, 30, -async, 2, [path]/encoded.ts 

08:40:29,843 DEBUG ~ FFMPEG(1): libavutil  51. 63.100/51. 63.100 
08:40:29,843 DEBUG ~ FFMPEG(1): libavcodec  54. 32.100/54. 32.100 
08:40:29,843 DEBUG ~ FFMPEG(1): libavformat 54. 14.100/54. 14.100 
08:40:29,843 DEBUG ~ FFMPEG(1): libavdevice 54. 0.100/54. 0.100 
08:40:29,843 DEBUG ~ FFMPEG(1): libavfilter  3. 0.101/3. 0.101 
08:40:29,844 DEBUG ~ FFMPEG(1): libswscale  2. 1.100/2. 1.100 
08:40:29,844 DEBUG ~ FFMPEG(1): libswresample 0. 15.100/0. 15.100 
08:40:29,844 DEBUG ~ FFMPEG(1): libpostproc 52. 0.100/52. 0.100 
08:40:30,033 DEBUG ~ FFMPEG(1): Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '[path]/test.mov': 
08:40:30,033 DEBUG ~ FFMPEG(1): Metadata: 
08:40:30,033 DEBUG ~ FFMPEG(1):  major_brand  : qt 
08:40:30,033 DEBUG ~ FFMPEG(1):  minor_version : 537199360 
08:40:30,035 DEBUG ~ FFMPEG(1):  compatible_brands: qt 
08:40:30,035 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:54:24 
08:40:30,036 DEBUG ~ FFMPEG(1):  timecode  : 00:00:00:00 
08:40:30,036 DEBUG ~ FFMPEG(1): Duration: 00:00:24.20, start: 0.000000, bitrate: 9912 kb/s 
08:40:30,037 DEBUG ~ FFMPEG(1):  Stream #0:0(eng): Video: h264 (Main) (avc1/0x31637661), yuv420p, 1920x1080, 9777 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc 
08:40:30,037 DEBUG ~ FFMPEG(1):  Metadata: 
08:40:30,037 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:56:28 
08:40:30,037 DEBUG ~ FFMPEG(1):  handler_name : Apple Video Media Handler 
08:40:30,038 DEBUG ~ FFMPEG(1):  Stream #0:1(eng): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, s16, 129 kb/s 
08:40:30,038 DEBUG ~ FFMPEG(1):  Metadata: 
08:40:30,038 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:56:28 
08:40:30,038 DEBUG ~ FFMPEG(1):  handler_name : Apple Sound Media Handler 
08:40:30,038 DEBUG ~ FFMPEG(1):  Stream #0:2(eng): Data: none (tmcd/0x64636D74) 
08:40:30,038 DEBUG ~ FFMPEG(1):  Metadata: 
08:40:30,038 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:56:28 
08:40:30,039 DEBUG ~ FFMPEG(1):  handler_name : Time Code Media Handler 
08:40:30,039 DEBUG ~ FFMPEG(1):  timecode  : 00:00:00:00 
08:40:30,092 DEBUG ~ FFMPEG(1): [graph 0 input from stream 0:0 @ 0x1c17180] w:1920 h:1080 pixfmt:yuv420p tb:1/25 fr:25/1 sar:0/1 sws_param:flags=2 
08:40:30,092 DEBUG ~ FFMPEG(1): [output stream 0:0 @ 0x1c033a0] No opaque field provided 
08:40:30,110 DEBUG ~ FFMPEG(1): [scaler for output stream 0:0 @ 0x1c18040] w:1920 h:1080 fmt:yuv420p sar:0/1 -> w:960 h:540 fmt:yuv420p sar:0/1 flags:0x4 
08:40:30,110 DEBUG ~ FFMPEG(1): [graph 1 input from stream 0:1 @ 0x1c53440] tb:1/48000 samplefmt:s16 samplerate:48000 chlayout:0x3 
08:40:30,110 DEBUG ~ FFMPEG(1): -async is forwarded to lavfi similarly to -af aresample=min_comp=0.001:min_hard_comp=0.100000:max_soft_comp=0.000042. 
08:40:30,122 DEBUG ~ FFMPEG(1): [graph 1 aresample for input stream 0:1 @ 0x1c36880] chl:stereo fmt:s16 r:48000Hz -> chl:stereo fmt:flt r:48000Hz 
08:40:30,142 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] using SAR=1/1 
08:40:30,142 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] frame MB size (60x34) > level limit (1620) 
08:40:30,142 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] DPB size (4 frames, 3133440 bytes) > level limit (3 frames, 3110400 bytes) 
08:40:30,142 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] MB rate (51000) > level limit (40500) 
08:40:30,170 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] using cpu capabilities: MMX2 SSE2Slow SlowCTZ 
08:40:30,182 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] profile Main, level 3.0 
08:40:30,235 DEBUG ~ FFMPEG(1): [mpegts @ 0x1be3540] muxrate VBR, pcr every 2 pkts, sdt every 200, pat/pmt every 40 pkts 
08:40:30,235 DEBUG ~ FFMPEG(1): Output #0, mpegts, to '[path]/encoded.ts': 
08:40:30,235 DEBUG ~ FFMPEG(1): Metadata: 
08:40:30,235 DEBUG ~ FFMPEG(1):  major_brand  : qt 
08:40:30,235 DEBUG ~ FFMPEG(1):  minor_version : 537199360 
08:40:30,235 DEBUG ~ FFMPEG(1):  compatible_brands: qt 
08:40:30,235 DEBUG ~ FFMPEG(1):  timecode  : 00:00:00:00 
08:40:30,235 DEBUG ~ FFMPEG(1):  encoder   : Lavf54.14.100 
08:40:30,235 DEBUG ~ FFMPEG(1):  Stream #0:0(eng): Video: h264, yuv420p, 960x540 [SAR 1:1 DAR 16:9], q=10-51, 1200 kb/s, 90k tbn, 25 tbc 
08:40:30,235 DEBUG ~ FFMPEG(1):  Metadata: 
08:40:30,235 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:56:28 
08:40:30,235 DEBUG ~ FFMPEG(1):  handler_name : Apple Video Media Handler 
08:40:30,236 DEBUG ~ FFMPEG(1):  Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, flt, 128 kb/s 
08:40:30,236 DEBUG ~ FFMPEG(1):  Metadata: 
08:40:30,236 DEBUG ~ FFMPEG(1):  creation_time : 2011-12-05 10:56:28 
08:40:30,236 DEBUG ~ FFMPEG(1):  handler_name : Apple Sound Media Handler 
08:40:30,236 DEBUG ~ FFMPEG(1): Stream mapping: 
08:40:30,236 DEBUG ~ FFMPEG(1): Stream #0:0 -> #0:0 (h264 -> libx264) 
08:40:30,236 DEBUG ~ FFMPEG(1): Stream #0:1 -> #0:1 (aac -> aac) 

[...] 

08:40:55,398 DEBUG ~ FFMPEG(1): video:3121kB audio:359kB subtitle:0 global headers:0kB muxing overhead 11.132085% 
08:40:55,407 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] frame I:21 Avg QP:21.57 size: 88153 
08:40:55,407 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] frame P:233 Avg QP:22.74 size: 5560 
08:40:55,407 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] frame B:351 Avg QP:27.45 size: 141 
08:40:55,407 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] consecutive B-frames: 21.7% 2.0% 3.0% 73.4% 
08:40:55,407 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] mb I I16..4: 54.5% 0.0% 45.5% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] mb P I16..4: 4.7% 0.0% 1.3% P16..4: 24.6% 3.5% 0.8% 0.0% 0.0% skip:65.1% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] mb B I16..4: 0.1% 0.0% 0.1% B16..8: 0.5% 0.1% 0.0% direct: 0.6% skip:98.6% L0:32.3% L1:47.1% BI:20.6% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] coded y,uvDC,uvAC intra: 59.4% 5.8% 0.4% inter: 5.4% 3.0% 0.0% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] i16 v,h,dc,p: 58% 16% 21% 4% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 21% 17% 5% 10% 7% 5% 5% 10% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] i8c dc,h,v,p: 94% 3% 3% 0% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] Weighted P-Frames: Y:13.7% UV:3.4% 
08:40:55,422 DEBUG ~ FFMPEG(1): [libx264 @ 0x1be3cc0] kb/s:1056.61 

對於分割爲:

ffmpeg, -i,[path]encoded.ts, -y, -c, copy, -flags, global_header, -map, 0, -f, segment, -segment_time, 10, -segment_list, [path]/fileList.txt, -segment_format, mpegts, [path]/segment_%05d.ts] 

任何幫助將真正理解!

回答

1

http://developer.android.com/guide/appendix/media-formats.html

所有視頻品質推薦視頻編解碼器是H.264 Baseline Profile的(這實際上是非常糟糕),所以也許這是因爲提出的上述理由,或更好說,由於一些類型不兼容的在這些格式,內容等內。

+0

我想這可能是,但不是很滿意。由於在h264郵件列表或ffmpeg郵件列表上還有更多的建議,我可能很快就會發現,如果有人知道某人有興趣進行更深入的調查研究。 – 2012-09-21 15:57:06

4

Apple Media Validator報告的錯誤是合法的。實際上,TS文件左右分裂。

問題文件(segment_00000.ts)的H.264在PID 0x100和AAC在0x0101。 PCR_PID被設置爲0x0100,這是AVC流。

在文件偏移量564,它具有以下的TS包:

47 41 00 30 
07 50 FF FF F5 B0 7E 00 
00 00 01 E0 0D D8 80 C0 0A 31 00 01 0F 01 1F FF FF D6 C1 00 

第二行是adaptation_field的哪些信號PCR = 2576978793600.第三行是信號PTS = 576000和DTS = 2576978793600 PES分組在27Mhz蜱。

由於PTS離開了PCR,我們可以說這個TS數據包已經損壞。

以文件偏移量9212和PCR爲576000,PTS爲2736000,DTS爲576000發信號通知以下PCR。現在,我們有了這些觀察結果。

  1. PCR/PTS/DTS現在已經有些懂事值,但...
  2. 相比之前的DTS,這種新的DTS較早,因此蘋果介質驗證報告錯誤。
  3. PCR與DTS相同,表示T-STD下溢錯誤。

不幸的是,我不熟悉ffmpeg,所以我不知道如何解決它。但是,通過查看這個輸出文件,我感覺到使用中的TS多路複用器還沒有達到最高質量。

0

對於HLS,您應該使用hls muxer(-f hls),而不是通用段複用器。通用分段複用器並不真正產生與HLS兼容的TS文件。