这是 的输出ffprobe
。
Input #0, mpegts, from 'udp://239.0.0.80:2345?localaddr=192.168.2.127':
Duration: N/A, start: 39580.799967, bitrate: N/A
Program 60
Metadata:
service_name : ChannelName
service_provider: ProviderName
Stream #0:0[0x3d]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x40](slo): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:2[0x41](slo): Audio: ac3 ([6][0][0][0] / 0x0006), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:3[0x42](qaa): Audio: mp3 ([3][0][0][0] / 0x0003), 0 channels, fltp
Stream #0:4[0x43](slo): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 64 kb/s (visual impaired) (descriptions) (dependent)
Stream #0:5[0x3e](slo): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006), 492x250
Stream #0:6[0x44]: Unknown: none ([5][0][0][0] / 0x0005)
Stream #0:7[0x3f](slo): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
注意奇怪的开始时间,它不像正常流那样从零开始。进度输出示例:frame= 515 fps=125 q=-1.0 size=N/A time=-577014:32:22.77 bitrate=N/A speed=N/A
。负时间!更奇怪。有人已经遇到过这个问题:https://trac.ffmpeg.org/ticket/3427。时间完全相同!(-577014:32:22.77)。(它已经修复了。8 年了。我肯定没有安装 8 年的 FFmpeg。)所以我真的不知道我们是否有完全相同的输入,或者其他什么。无论如何,我遇到的另一个问题是我必须增加到max_muxing_queue_size
99999,低于 16384 的值无法工作,我认为这是相关的 - 但任何其他具有完全相同选项的流都会输出 HLS 流。
ffmpeg -i udp://239.0.0.80:2345?localaddr=192.168.2.127 -y -acodec aac -b:a 128k -vcodec copy -sn -map 0 -avoid_negative_ts make_zero -copyts -start_at_zero -max_muxing_queue_size 99999 -ignore_unknown -f hls -hls_time 6 -hls_list_size 4 -segment_list_flags live -hls_flags independent_segments+delete_segments -segment_wrap 8 id2/index.m3u8
请注意,这-avoid_negative_ts make_zero -start_at_zero
绝对不起作用。他们似乎被忽略了。这里的问题是什么?谢谢大家的帮助!
这是输出ffmpeg -version
(我没有使用超过 8 年的旧版本)
built with gcc 10 (Ubuntu 10.2.1-20ubuntu1)
configuration: --prefix=/usr --extra-version=0+deb11u1ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
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
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
答案1
要将 mpts UDP 流转换为 hls,您可以选择音频流并映射所需的流,例如-map 0:0 -map 0:1
。它将解决您当前的问题,但您将丢失所有其他流。
否则,你可以使用如下方法:
`ffmpeg -i "udp://239.0.0.80:2345?localaddr=192.168.2.127&pkt_size=1316" -map 0:v:0 -map 0:a:1 -map 0:a:2 -map 0:a:4 -b:v 2000k -b:a:1 192k -b:a:2 192k -b:a:4 64k -f hls -var_stream_map "v:0,a:1,a:2,a:4" -f hls -hls_time 3 -hls_segment_type mpegts -hls_flags delete_segments -hls_segment_filename 'file_%v_%03d.ts' id2/index.m3u8`
此外,-hls_segment_type mpegts
根据我的经验,请使用,这会使将 UDP mpegts 流转码为 HLS 时更加稳定。