如何使用 ffmpeg 将多个 .ts 文件转换为一个非碎片化的.mp4 文件?

问题描述

问题描述

我使用的视频播放器不支持 .ts 文件,但它可以播放 .mp4 文件,所以我想使用 ffmpeg 将我的 .ts 文件转换.mp4文件

目标解决方

使用 ffmpeg 下载多个 .ts 片段并将它们转码为一个 .mp4 文件,我将加载到我的视频播放器中。冲洗并重复。它会增加 10-20 秒的延迟,但没关系。

诀窍是进行足够快的转码,以便在播放完一个 .mp4 文件时,下一个可用;换句话说,转码每秒的镜头应该不到一秒。理想情况下,考虑到不同设备上不同的处理能力,所需的时间会比这少得多。

澄清一下,当我说 .mp4 时,我不是指的是碎片化的 .mp4 文件


如果转码为其他格式更快,那也可能没问题。例如,我知道 .mkv 格式是可播放的。我仍在探索所有可用的格式。

我的尝试

我测试了将 1 个 .ts 文件转码为 .mp4 文件,不幸的是,当文件长约 4 秒时,它花了约 6 秒。那是ffmpeg-wasm。我希望 JavaScript 桥接器可能会减慢速度,并且在 1 次调用中批处理多个 .ts 段可能会有所帮助。

命令

ffmpeg -i test.ts test.mp4

日志

[info] run FS.writeFile test.ts <349304 bytes binary file>
log.js:15 [info] run ffmpeg command: -i test.ts test.mp4
log.js:15 [fferr] ffmpeg version v0.9.0-2-gb11e5c1495 copyright (c) 2000-2020 the FFmpeg developers
log.js:15 [fferr]   built with emcc (Emscripten gcc/clang-like replacement) 2.0.8 (d059fd603d0b45b584f634dc2365bc9e9a6ec1dd)
log.js:15 [fferr]   configuration: --target-os=none --arch=x86_32 --enable-cross-compile --disable-x86asm --disable-inline-asm --disable-stripping --disable-programs --disable-doc --disable-debug --disable-runtime-cpudetect --disable-autodetect --extra-cflags='-s USE_PTHREADS=1 -I/src/build/include -O3 --closure 1' --extra-cxxflags='-s USE_PTHREADS=1 -I/src/build/include -O3 --closure 1' --extra-ldflags='-s USE_PTHREADS=1 -I/src/build/include -O3 --closure 1 -L/src/build/lib' --pkg-config-flags=--static --nm=llvm-nm --ar=emar --ranlib=emranlib --cc=emcc --cxx=em++ --objcc=emcc --dep-cc=emcc --enable-gpl --enable-nonfree --enable-zlib --enable-libx264 --enable-libx265 --enable-libvpx --enable-libwavpack --enable-libmp3lame --enable-libfdk-aac --enable-libtheora --enable-libvorbis --enable-libfreetype --enable-libopus --enable-libwebp --enable-libass --enable-libfribidi
log.js:15 [fferr]   libavutil      56. 51.100 / 56. 51.100
log.js:15 [fferr]   libavcodec     58. 91.100 / 58. 91.100
log.js:15 [fferr]   libavformat    58. 45.100 / 58. 45.100
log.js:15 [fferr]   libavdevice    58. 10.100 / 58. 10.100
log.js:15 [fferr]   libavfilter     7. 85.100 /  7. 85.100
log.js:15 [fferr]   libswscale      5.  7.100 /  5.  7.100
log.js:15 [fferr]   libswresample   3.  7.100 /  3.  7.100
log.js:15 [fferr]   libpostproc    55.  7.100 / 55.  7.100
log.js:15 [fferr] Input #0,mpegts,from 'test.ts':
log.js:15 [fferr]   Duration: 00:00:04.00,start: 10.006000,bitrate: 698 kb/s
log.js:15 [fferr]   Program 1 
log.js:15 [fferr]     Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),yuv420p(progressive),1280x720,23.98 tbr,90k tbn,1411200000.00 tbc
log.js:15 [fferr]     Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F),48000 Hz,stereo,fltp,130 kb/s
log.js:15 [fferr] Stream mapping:
log.js:15 [fferr]   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
log.js:15 [fferr]   Stream #0:1 -> #0:1 (aac (native) -> aac (native))
log.js:15 [fferr] [libx264 @ 0x1f5f080] using cpu capabilities: none!
log.js:15 [fferr] [libx264 @ 0x1f5f080] profile High,level 3.1,4:2:0,8-bit
log.js:15 [fferr] [libx264 @ 0x1f5f080] 264 - core 160 - H.264/MPEG-4 AVC codec - copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
log.js:15 [fferr] Output #0,mp4,to 'test.mp4':
log.js:15 [fferr]   Metadata:
log.js:15 [fferr]     encoder         : Lavf58.45.100
log.js:15 [fferr]     Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661),yuv420p,q=-1--1,23.98 fps,24k tbn,23.98 tbc
log.js:15 [fferr]     Metadata:
log.js:15 [fferr]       encoder         : Lavc58.91.100 libx264
log.js:15 [fferr]     Side data:
log.js:15 [fferr]       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
log.js:15 [fferr]     Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D),128 kb/s
log.js:15 [fferr]     Metadata:
log.js:15 [fferr]       encoder         : Lavc58.91.100 aac
log.js:15 [fferr] frame=    3 fps=0.0 q=0.0 size=       0kB time=00:00:00.38 bitrate=   1.0kbits/s dup=1 drop=0 speed=0.521x    
log.js:15 [fferr] frame=   47 fps= 27 q=0.0 size=       0kB time=00:00:02.09 bitrate=   0.2kbits/s dup=1 drop=0 speed=1.22x    
log.js:15 [fferr] frame=   57 fps= 25 q=28.0 size=       0kB time=00:00:02.51 bitrate=   0.2kbits/s dup=1 drop=0 speed=1.13x    
log.js:15 [fferr] frame=   67 fps= 24 q=28.0 size=       0kB time=00:00:02.96 bitrate=   0.1kbits/s dup=1 drop=0 speed=1.08x    
log.js:15 [fferr] frame=   77 fps= 23 q=28.0 size=       0kB time=00:00:03.37 bitrate=   0.1kbits/s dup=1 drop=0 speed=1.03x    
log.js:15 [fferr] frame=   89 fps= 23 q=28.0 size=       0kB time=00:00:03.96 bitrate=   0.1kbits/s dup=1 drop=0 speed=1.04x    
log.js:15 [fferr] frame=   96 fps= 15 q=-1.0 Lsize=      60kB time=00:00:04.01 bitrate= 122.8kbits/s dup=1 drop=0 speed=0.646x    
log.js:15 [fferr] video:55kB audio:1kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 7.249582%
log.js:15 [fferr] [libx264 @ 0x1f5f080] frame I:1     Avg QP:17.20  size: 31521
log.js:15 [fferr] [libx264 @ 0x1f5f080] frame P:24    Avg QP:16.17  size:   735
log.js:15 [fferr] [libx264 @ 0x1f5f080] frame B:71    Avg QP:27.68  size:    91
log.js:15 [fferr] [libx264 @ 0x1f5f080] consecutive B-frames:  1.0%  0.0%  3.1% 95.8%
log.js:15 [fferr] [libx264 @ 0x1f5f080] mb I  I16..4: 26.2% 56.4% 17.4%
log.js:15 [fferr] [libx264 @ 0x1f5f080] mb P  I16..4:  0.1%  0.2%  0.0%  P16..4:  3.5%  0.4%  0.2%  0.0%  0.0%    skip:95.4%
log.js:15 [fferr] [libx264 @ 0x1f5f080] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  1.6%  0.0%  0.0%  direct: 0.0%  skip:98.3%  L0:31.0% L1:69.0% BI: 0.0%
log.js:15 [fferr] [libx264 @ 0x1f5f080] 8x8 transform intra:56.5% inter:59.4%
log.js:15 [fferr] [libx264 @ 0x1f5f080] coded y,uvDC,uvAC intra: 17.4% 15.4% 7.5% inter: 0.2% 0.4% 0.0%
log.js:15 [fferr] [libx264 @ 0x1f5f080] i16 v,h,dc,p: 29% 63%  1%  7%
log.js:15 [fferr] [libx264 @ 0x1f5f080] i8 v,ddl,ddr,vr,hd,vl,hu: 51% 31% 14%  0%  2%  1%  1%  0%  1%
log.js:15 [fferr] [libx264 @ 0x1f5f080] i4 v,hu: 26% 45% 11%  2%  3%  2%  4%  2%  4%
log.js:15 [fferr] [libx264 @ 0x1f5f080] i8c dc,v,p: 76% 17%  6%  1%
log.js:15 [fferr] [libx264 @ 0x1f5f080] Weighted P-Frames: Y:0.0% UV:0.0%
log.js:15 [fferr] [libx264 @ 0x1f5f080] ref P L0: 89.5%  1.6%  6.7%  2.3%
log.js:15 [fferr] [libx264 @ 0x1f5f080] ref B L0: 38.5% 60.9%  0.6%
log.js:15 [fferr] [libx264 @ 0x1f5f080] ref B L1: 97.7%  2.3%
log.js:15 [fferr] [libx264 @ 0x1f5f080] kb/s:111.08
log.js:15 [fferr] [aac @ 0x1f48100] Qavg: 65536.000
log.js:15 [ffout] FFMPEG_END
log.js:15 [info] run FS.readFile test.mp4
(index):38 Time elapsed: 6345 (This one's my own code.)
[info] run FS.readFile test.mp4

(我在浏览器上运行它。对于这个问题,考虑 HTML 播放器不可用。)


我还测试了将 HLS 直播 URL 作为输入提供给 ffmpeg 并输出单个 .mp4 文件,但我无法播放它,直到我结束直播并且 ffmpeg 完成下载。>

我在(Windows)PC上运行的这个;不是浏览器。

命令

ffmpeg -i https://stream.mux.com/lngMYGqNpHhYg2ZXqpH8WODVGzuenaZuhckdyunGpzU.m3u8 -acodec copy -bsf:a aac_adtstoasc -vcodec copy out.mp4

日志

日志太大,StackOverflow 不让我把它粘贴在这里,所以我把它上传到 PasteBin:https://pastebin.com/FqvPQ1DZ

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)