Encoding for HLS using FFMPEG results in have a decreasing DTS - encoding
I am trying to encode video for HTS live streaming, but am having problems with validating the stream using Apple Media Validator (mediastreamvalidator).
(my test file: http://dominicansinteractive.idoms.org/media/9536/playlist.m3u8)
The output is:
--------------------------------------------------------------------------------
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 %)
The second segment doesn't seem to have the problem:
[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
This seems to be a serious problem for HLS, so I am looking if there is a way to fix this.
When looking with FFMPEG at the encoded file I get (encoder output/command at the bottom of the email):
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
This problem does not occur with the BASELINE profile, but does with MAIN.
The command I use for encoding is:
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
For segmenting is:
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]
Any help would really be appreciated!
The error reported by Apple Media Validator is legit. In fact, the TS file is broken left and right.
The problem file (segment_00000.ts) has H.264 at PID 0x100 and AAC at 0x0101. The PCR_PID is set to 0x0100, which is the AVC stream.
At the file offset 564, it has the following TS packet:
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
The second line is adaptation_field which signals PCR = 2576978793600. The 3rd line is PES packet which signals PTS = 576000 and DTS = 2576978793600 in 27Mhz tick.
As PTS is way off from PCR, we can say this TS packet is broken.
The following PCR is signaled at file offset 9212 and the PCR is 576000, PTS is 2736000, and DTS is 576000. Now, we have these observations.
PCR/PTS/DTS have now somewhat sensible values, but ...
Compared to the previous DTS, this new DTS is earlier, thus Apple Media Validator reports the error.
PCR is same as DTS, which indicates T-STD underflow error.
Unfortunately, I am not familiar with ffmpeg so I don't know how to fix it. However, by just looking at this output file, I got impression that the TS multiplexer in use is not at the highest quality yet.
http://developer.android.com/guide/appendix/media-formats.html
Recommended video codec for all video qualities is H.264 Baseline Profile (which is actually pretty bad) so maybe this is suggested because of the above reason, or better said, because of some type of incompatibility inside those formats, contents etc.
For HLS you should use the hls muxer (-f hls), not the generic segment muxer. The generic segment muxer doesn't really produce TS files compatible with HLS.
Related
Diagnose "no frame!" error of fragmented MP4
IMHO, MP4 (ISO/IEC 14496-12) is quite complicated. This question is meant for those familiar with ins and outs of MP4, so I try to be brief. Otherwise, this question could be a long essay. I am trying to create fMP4 with C# (the language is not relevant here). The created fMP4 file does not play. Using the tool ffprobe to check the file generates the following: ffprobe "foo.mp4" [h264 # 0000021625d10e40] no frame! Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'foo.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: avc1mp42isomiso6 creation_time : 2022-09-11T00:24:35.000000Z Duration: 00:00:10.06, start: 0.000000, bitrate: 2078 kb/s Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x800 [SAR 1:1 DAR 8:5], 2077 kb/s, 12.22 fps, 30 tbr, 1000k tbn, 2000k tbc (default) Metadata: creation_time : 2022-09-11T00:24:35.000000Z handler_name : Media Handler vendor_id : [0][0][0][0] encoder : AVC Coding Please note the error: [h264 # 0000021625d10e40] no frame! When I use: ffprobe -show_frames "foo.mp4" It shows hundreds of frames of this small MP4 file that seem flawless. I cannot paste them here there are thousands of lines. However, ffprobe shows two errors at the start: [h264 # 000001b015110ec0] no frame! [h264 # 000001b01545e7c0] no frame! Please note these two "no frame!" errors generated by ffprobe -show_frames are different from the first one by ffprobe without the -show_frames option. I wonder if anyone could offer a tip about what these "no frame!" errors mean and where I should chase the culprit. The following is what Mp4 Explorer shows: Update 2022-09-17 Here is an fMP4 file: example.mp4. Every video player seems to be able to play it except for VLC Player. VLC Player is an important player. I would love to make it work for it. Could anyone offer a clue about why VLC Player does not like it?
Streaming to Facebook Live from ffmpeg gets terminated
I am trying to capture the canvas on browser (canvas.captureStream), add audio ( captured using getUserMedia and added to stream using canvasStream.addTracks) and send it to server. Server sends the stream ( after encoding with H264 ) to facebook live using ffmpeg. However the stream is not stable and gets disconnected within minutes. If the video along with audio tracks (using getMediaUser) is directly(without canvas.captureStream) sent it works fine. I am suspecting it has to do with the audio track not being proper and hence facebook rejecting it ( no particular error from ffmpeg, it just exits with IO error). Need help in figuring out the right way to send canvas stream along with audio. Current ffmpeg command is as below ffmpeg -i - -c:v libx264 -crf 23 -preset ultrafast \ -tune zerolatency -max_muxing_queue_size 1000 \ -vsync cfr -async 1 -bufsize 2M -r 30 -g 60 -keyint_min 30 \ -x264opts keyint=30 -pix_fmt yuv420p -level 3 \ -c:a aac -b:a 96k -ar 96000 \ -f tee -map 0:v -map 0:a [f=flv] <rtmp url 1> | [f=flv] <rtmp url 2> Note: In the above command <rtmp url 1> and <rtmp url 2> are replaced with actual urls ( including the session key required ) My settings to capture canvas and audio on browser are as below canvasStream = canvas.captureStream(30); audioTrack = stream.getTracks().filter( (track) => { return track.kind === 'audio'; })[0]; canvasStream.addTrack(audioTrack); Note: Audio constraints given in getUserMedia are as below audio: { sampleRate: 44100, echoCancellation: true } Error given by ffmpeg while exiting is as below FFMPEG:[flv # 0x5626ecf0f7c0] Failed to update header with correct duration. [flv # 0x5626ecf0f7c0] Failed to update header with correct filesize. FFMPEG:[tee # 0x5626ec8550c0] Slave muxer #1 failed, aborting. av_interleaved_write_frame(): Broken pipe FFMPEG:[flv # 0x5626ecbe8840] Failed to update header with correct duration. FFMPEG:[flv # 0x5626ecbe8840] Failed to update header with correct filesize. FFMPEG:frame= 2378 fps= 22 q=22.0 Lsize=N/A time=00:01:21.17 bitrate=N/A dup=2202 drop=5 speed=0.745x video:18916kB audio:959kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown FFMPEG:[libx264 # 0x5626ec855b80] frame I:80 Avg QP:13.97 size:115968 [libx264 # 0x5626ec855b80] frame P:2298 Avg QP:16.77 size: 4392 [libx264 # 0x5626ec855b80] mb I I16..4: 100.0% 0.0% 0.0% FFMPEG:[libx264 # 0x5626ec855b80] mb P I16..4: 3.8% 0.0% 0.0% P16..4: 9.5% 0.0% 0.0% 0.0% 0.0% skip:86.7% [libx264 # 0x5626ec855b80] coded y,uvDC,uvAC intra: 26.3% 42.2% 13.6% inter: 2.9% 6.1% 0.1% [libx264 # 0x5626ec855b80] i16 v,h,dc,p: 34% 26% 23% 17% [libx264 # 0x5626ec855b80] i8c dc,h,v,p: 46% 27% 20% 7% [libx264 # 0x5626ec855b80] kb/s:1954.96 [aac # 0x5626ec84d200] Qavg: 122.161 Conversion failed! Appreciate any help with this.
I am suspecting it has to do with the audio track not being proper and hence facebook rejecting it Yes, this is correct. Facebook requires an audio track and will drop your stream if it isn't present. For starters, drop -ar 96000 from your FFmpeg command. This would be setting a sample rate of 96 kHz, which Facebook isn't going to want. You really don't want to resample at FFmpeg anyway... just let it use whatever sample rate it gets from the browser. Next, set your audio sample rate to 48 kHz rather than 44.1 kHz on your getUserMedia constraints. Facebook doesn't handle 44.1 kHz audio on the RTMP ingest well. (Generally these days, you want to use 48 kHz for everything unless you're targeting CD audio, which would be 44.1 kHz.) Next, your FFmpeg audio command is outputting to two RTMP URLs. If one fails, they will both fail. If one gets behind, they will both be stalled. This is probably not what you want. :-) Drop one of them. Now, make sure you have a decent and consistent frame rate. Facebook is very picky about this and will drop your stream. To test/debug, replace your RTMP URL output with a simple FLV file on disk, to ensure things are working from the browser up through FFmpeg. Once you have that all smooth and working, you can reconnect to Facebook and go from there.
Laggy video and longer duration than the original file
I'm trying to convert a file with this output in ffmpeg: ffmpeg version 4.3.1-2021-01-01-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers built with gcc 10.2.0 (Rev5, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 56. 51.100 / 56. 51.100 libavcodec 58. 91.100 / 58. 91.100 libavformat 58. 45.100 / 58. 45.100 libavdevice 58. 10.100 / 58. 10.100 libavfilter 7. 85.100 / 7. 85.100 libswscale 5. 7.100 / 5. 7.100 libswresample 3. 7.100 / 3. 7.100 libpostproc 55. 7.100 / 55. 7.100 [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. Last message repeated 5 times [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. Last message repeated 1 times [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported Last message repeated 1 times [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported Last message repeated 1 times [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. Last message repeated 1 times [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. Last message repeated 1 times [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported Last message repeated 1 times [mpeg2video # 000002e8de943080] Invalid frame dimensions 0x0. [s302m # 000002e8de960780] S302 non PCM mode with data type 28 not supported Last message repeated 4 times [mpegts # 000002e8de93cbc0] decoding for stream 3 failed [mpegts # 000002e8de93cbc0] Could not find codec parameters for stream 3 (Audio: s302m (BSSD / 0x44535342), stereo, s32 (20 bit), 2304 kb/s): unspecified sample rate Consider increasing the value for the 'analyzeduration' and 'probesize' options Input #0, mpegts, from 'G:\test\test.ts': Duration: 03:27:29.61, start: 3.000000, bitrate: 39124 kb/s Program 1 Stream #0:0[0x200]: Video: mpeg2video (4:2:2) ([2][0][0][0] / 0x0002), yuv422p(tv, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 450 tbr, 90k tbn, 50 tbc Side data: cpb: bitrate max/min/avg: 36898800/0/0 buffer size: 13271040 vbv_delay: N/A Stream #0:1[0x1010]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 384 kb/s Stream #0:2[0x1020]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 384 kb/s Stream #0:3[0x1030]: Audio: s302m (BSSD / 0x44535342), stereo, s32 (20 bit), 2304 kb/s But whatever setting i try the video ends up very laggy and the duration ends up much longer than the original file, even when I play it through VLC. It is a little hard to explain so I will provide a sample file here with the result after the conversion: https://drive.google.com/file/d/1ADPF2POSnBCiJkgMES2vOn2wznyBst6W/view?usp=sharing Is it something wrong with the file or with ffmpeg itself and how do I solve it? Firstly I tried this command: ffmpeg -i "G:\test\test.ts" -map 0:0 -map 0:1 -vcodec libx265 -crf 23 -filter:v yadif=1 -acodec ac3 -ab 384k "C:\Users\User name\Videos\test.mkv" And then I tried this with the same result: ffmpeg -i "G:\test\test.ts" -map 0:0 -map 0:1 -vcodec copy -acodec copy "C:\Users\User name\Videos\test.mkv" The sample file is converted with the first command.
How to encode specific metadata version in FFMPEG?
I am batch converting lots of songs into shorter "Advert" songs for SHOUTcast and to be recognised as adverts by the server. The song must have ":Advert" for both the title and the artist metadata tags. When I use the following command: ffmpeg -i "$i" -c copy -vn -map_metadata -1 -metadata title=":Advert" -metadata artist=":Advert" -t 120 "adverts/ADVERT_$i" I would expect it to output the song with only ":Advert" as title and artist metadata but when I import it into the radio playout software (using ID3 1.x tagging) the metadata has not copied across and is therefore lost. Output from ffmpeg: ffmpeg version 3.0.2 Copyright (c) 2000-2016 the FFmpeg developers built with Apple LLVM version 9.0.0 (clang-900.0.37) configuration: --prefix=/usr/local/Cellar/ffmpeg/3.0.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda libavutil 55. 17.103 / 55. 17.103 libavcodec 57. 24.102 / 57. 24.102 libavformat 57. 25.100 / 57. 25.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 31.100 / 6. 31.100 libavresample 3. 0. 0 / 3. 0. 0 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100 [mp3 # 0x7feba6800000] Skipping 0 bytes of junk at 230934. [mjpeg # 0x7feba7000600] Changing bps to 8 Input #0, mp3, from 'Joakim Karud - Vibe With Me.mp3': Metadata: major_brand : dash minor_version : 0 compatible_brands: iso6mp41 encoder : Lavf56.40.101 artist : Joakim Karud title : Vibe With Me Duration: 00:02:53.06, start: 0.025056, bitrate: 138 kb/s Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s Metadata: encoder : Lavc56.60 Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 90k tbr, 90k tbn, 90k tbc Metadata: comment : Cover (front) Output #0, mp3, to 'adverts/ADVERT_Joakim Karud - Vibe With Me.mp3': Metadata: TIT2 : :Advert TPE1 : :Advert TSSE : Lavf57.25.100 Stream #0:0: Audio: mp3, 44100 Hz, stereo, 128 kb/s Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help size= 1876kB time=00:02:00.00 bitrate= 128.1kbits/s speed=1.44e+03x video:0kB audio:1876kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.024837% I believe this is happening because the tag names are different (e.g. title should be title, but is TIT2 when output. Please could someone specify how I could ensure that the metadata is encoded in the ID3 1.x format so that it is readable by the radio playout software. Many thanks.
FFmpeg, by default, writes only ID3v2.4 tags. ID3v1 has to be specified for writing. Use ffmpeg -i "$i" -c copy -vn -write_id3v1 true -map_metadata -1 -metadata title=":Advert" -metadata artist=":Advert" -t 120 "adverts/ADVERT_$i"
Terminate avconv streaming after X seconds
For an app I'm developing, I need avconv to stream from a link for a specified length of time. I've tried using -timelimit to no avail. What am I doing wrong? Is there a better way to do this? Why doesn't -timelimit work? See, for example, the call below, which runs until terminated with ctrl-c. stack#ThinkPad:~/app_dev$ avconv -timelimit 30 -i http://br-mp3-bayern2sued-m.akacast.akamaistream.net/7/731/256282/v1/gnl.akacast.akamaistream.net/br_mp3_bayern2sued_m stack_test.mp3 Which generates the following output. avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers built on Mar 16 2015 13:19:10 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) [mp3 # 0x765100] Header missing [mp3 # 0x75f020] max_analyze_duration reached [mp3 # 0x75f020] Estimating duration from bitrate, this may be inaccurate Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, mp3, from 'http://br-mp3-bayern2sued-m.akacast.akamaistream.net/7/731/256282/v1/gnl.akacast.akamaistream.net/br_mp3_bayern2sued_m': Duration: N/A, start: 0.000000, bitrate: 128 kb/s Stream #0.0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s Output #0, mp3, to 'stack_test.mp3': Metadata: TSSE : Lavf54.20.4 Stream #0.0: Audio: libmp3lame, 44100 Hz, stereo, s16p Stream mapping: Stream #0:0 -> #0:0 (mp3 -> libmp3lame) Press ctrl-c to stop encoding [mp3 # 0x765100] Header missing Error while decoding stream #0:0 [mp3 # 0x7639e0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: -2255 >= -2255
-t and -timelimit are different. More importantly, you need to use -t as an output option, not as an input option. Updating your example, the following should work (tested on ffmpeg). ffmpeg -i http://br-mp3-bayern2sued-m.akacast.akamaistream.net/7/731/256282/v1/gnl.akacast.akamaistream.net/br_mp3_bayern2sued_m -t 30 stack_test.mp3