Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 使用FFMPEG在浏览器中编码静态文件的交叉设备编码(分段h264?)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在NodeJS中构建@L_941_0@mediacenter应用程序,这很不错.
(你可以在 Github上查看: https://github.com/jansmolders86/mediacenterjs) @H_607_6@ @H_607_6@我正在使用FFMPEG将本地(静态)电影转码为流然后发送到浏览器.

@H_607_6@起初我使用h264和Flash在浏览器中工作,但我真的需要它在Android上运行iOS(所以没有Flash),最好是在RaspBerry Pi上工作.

@H_607_6@但是让它在所有设备上播放让我绝对疯狂!

@H_607_6@我从无数小时阅读文章,教程和堆栈溢出帖子中收集了所有这些难题,这使我得出结论,我需要生成以下内容

@H_607_6@ @H_607_6@但无处可去.每次我制作一系列不起作用的FFMPEG设置,或者在某些设备上工作而不是全部工作.

@H_607_6@我失败的一些尝试在哪里:

@H_607_6@我的闪光尝试 – >主要问题(不在IOS中运行):

@H_607_6@
'-y','-ss 0','-b 800k','-vcodec libx264','-acodec mp3'\ 
    '-ab 128','-ar 44100','-bufsize 62000','-maxrate 620k'\
    MetaDuration,tDuration,'-f flv
@H_607_6@我的HLS尝试 – >主要问题(未在浏览器中运行):

@H_607_6@
'-r 15','-b:v 128k','-c:v libx264','-x264opts level=41'\
        '-threads 4','-s 640x480','-map 0:v','-map 0:a:0','-c:a mp3'\
        '-b:a 160000','-ac 2','-f hls','-hls_time 10','-hls_list_size 6'\
        '-hls_wrap 18','-start_number 1'
@H_607_6@我的MP4尝试 – >主要问题(持续时间缩短,视频后期加速)

@H_607_6@
'-y','-acodec mp3'\
       '-ab 128','-maxrate 620k'\
       MetaDuration,'-f mp4','-movflags','frag_keyframe+empty_moov'
@H_607_6@第二次MP4尝试: – >主要问题(持续时间缩短,'-pix_fmt yuv420p','-b 1200k','-flags +loop+mv4'\ '-cmp 256','-partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8'\ '-me_method hex','-subq 7','-trellis 1','-refs 5','-bf 3','-coder 1'\ '-me_range 16','-g 150','-keyint_min 25','-sc_threshold 40'\ '-i_qfactor 0.71','-acodec mp3','-qmin 10','-qdiff 4','-qmax 51'\ '-ab 128k','-threads 2','frag_keyframe+empty_moov']) @H_607_6@以下是使用这些设置运行的FFMPEG日志的示例:

@H_607_6@
file conversion error ffmpeg version N-52458-gaa96439 Copyright (C) 2000-2013 the FFmpeg developers
          built on Apr 24 2013 22:19:32 with gcc 4.8.0 (GCC)
          configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --e
        nable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
        -libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --ena
        ble-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwola
        me --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enabl
        e-libxvid --enable-zlib
          libavutil      52. 27.101 / 52. 27.101
          libavcodec     55.  6.100 / 55.  6.100
          libavformat    55.  3.100 / 55.  3.100
          libavdevice    55.  0.100 / 55.  0.100
          libavfilter     3. 60.101 /  3. 60.101
          libswscale      2.  2.100 /  2.  2.100
          libswresample   0. 17.102 /  0. 17.102
          libpostproc    52.  3.100 / 52.  3.100
        [avi @ 02427900] non-interleaved AVI
        Guessed ChAnnel Layout for  Input Stream #0.1 : mono
        Input #0,avi,from 'C:/temp/the avengers.avi':
          Duration: 00:00:34.00,start: 0.000000,bitrate: 1433 kb/s
            Stream #0:0: Video: cinepak (cvid / 0x64697663),rgb24,320x240,15 tbr,15 tbn,15 tbc
            Stream #0:1: Audio: pcm_u8 ([1][0][0][0] / 0x0001),22050 Hz,mono,u8,176 kb/s
        Please use -b:a or -b:v,-b is ambiguous
        [libx264 @ 02527c60] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
        [libx264 @ 02527c60] profile High,level 2.0
        [libx264 @ 02527c60] 264 - core 130 r2274 c832fe9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x26
        4.html - options: caBAC=1 ref=5 deblock=1:0:0 analyse=0x3:0x133 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=2 lookahead_threads=1 sliced_th
        reads=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 we
        ightb=1 open_gop=0 weightp=2 keyint=150 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=120
        0 ratetol=1.0 qcomp=0.60 qpmin=10 qpmax=51 qpstep=4 ip_ratio=1.41 aq=1:1.00
        Output #0,mp4,to 'pipe:1':
          Metadata:
            encoder         : Lavf55.3.100
            Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021),yuv420p,q=10-51,1200 kb/s,15360 tbn,15 tbc
            Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069),44100 Hz,s16p,128 kb/s
        Stream mapping:
          Stream #0:0 -> #0:0 (cinepak -> libx264)
          Stream #0:1 -> #0:1 (pcm_u8 -> libmp3lamE)
        Press [q] to stop,[?] for Help
        frame=  106 fps=0.0 q=10.0 size=       1kB time=00:00:06.94 bitrate=   1.4kbits/s
        frame=  150 fps=149 q=14.0 size=       1kB time=00:00:09.87 bitrate=   1.0kbits/s
        frame=  191 fps=126 q=16.0 size=       1kB time=00:00:12.61 bitrate=   0.8kbits/s
        frame=  244 fps=121 q=16.0 size=    2262kB time=00:00:16.14 bitrate=1147.6kbits/s
        frame=  303 fps=120 q=14.0 size=    2262kB time=00:00:20.08 bitrate= 922.2kbits/s
        frame=  354 fps=117 q=15.0 size=    3035kB time=00:00:23.48 bitrate=1058.6kbits/s
        frame=  402 fps=113 q=15.0 size=    3035kB time=00:00:26.67 bitrate= 932.1kbits/s
        frame=  459 fps=113 q=16.0 size=    4041kB time=00:00:30.43 bitrate=1087.7kbits/s
        frame=  510 fps=103 q=2686559.0 Lsize=    5755kB time=00:00:33.93 bitrate=1389.3kbits/s

        video:5211kB audio:531kB subtitle:0 global headers:0kB muxing overhead 0.235111%
        [libx264 @ 02527c60] frame I:6     Avg QP:10.55  size: 25921
        [libx264 @ 02527c60] frame P:245   Avg QP:12.15  size: 14543
        [libx264 @ 02527c60] frame B:259   Avg QP:15.55  size:  6242
        [libx264 @ 02527c60] consecutive B-frames:  6.1% 73.7% 14.7%  5.5%
        [libx264 @ 02527c60] mb I  I16..4: 19.9%  6.2% 73.9%
        [libx264 @ 02527c60] mb P  I16..4:  6.0%  0.2% 12.0%  P16..4: 35.4%  9.6% 16.3%  7.0%  5.6%    skip: 7.8%
        [libx264 @ 02527c60] mb B  I16..4:  0.7%  0.0%  4.3%  B16..8: 27.6% 17.2% 17.0%  direct:17.3%  skip:15.9%  L0:39.4% L1:43.2%
        BI:17.4%
        [libx264 @ 02527c60] final ratefactor: 11.41
        [libx264 @ 02527c60] 8x8 transform intra:1.6% inter:4.0%
        [libx264 @ 02527c60] coded y,uvDC,uvAc intra: 93.0% 97.0% 94.9% inter: 58.4% 58.7% 50.6%
        [libx264 @ 02527c60] i16 v,h,dc,p: 15% 26% 54%  5%
        [libx264 @ 02527c60] i8 v,ddl,ddr,vr,hd,vl,hu: 16% 17% 39%  4%  4%  3%  1%  6%  9%
        [libx264 @ 02527c60] i4 v,hu: 28% 34% 21%  4%  2%  2%  2%  2%  5%
        [libx264 @ 02527c60] i8c dc,v,p: 51% 24% 19%  6%
        [libx264 @ 02527c60] Weighted P-Frames: Y:4.1% UV:1.2%
        [libx264 @ 02527c60] ref P L0: 68.2%  9.8% 11.0%  5.6%  4.6%  0.8%  0.0%
        [libx264 @ 02527c60] ref B L0: 87.7%  8.0%  3.9%  0.4%
        [libx264 @ 02527c60] ref B L1: 97.8%  2.2%
        [libx264 @ 02527c60] kb/s:1255.36
@H_607_6@最后这是我的节点代码启动FFMPEG. (我使用模块Fluent-ffmpeg:https://github.com/schaermu/node-fluent-ffmpeg)

@H_607_6@
var proc = new ffmpeg({ source: movie,nolog: true,timeout:15000})                         
        .addoptions(['-r 15','-x264opts level=41','-threads 4','-c:a mp3','-b:a 160000','-hls_list_size 6','-hls_wrap 18','-start_number 1 stream.m3u8'])
        .writeToStream(res,function(retcode,error){
            if (!error){
                console.log('file has been converted succesfully',retcode .green);
            }else{
                console.log('file conversion error',error .red);
            }
        });
@H_607_6@因此,总结这个非常长且代码重的问题:

@H_607_6@我希望这不会作为一个懒惰的请求,但有人可以向我展示/解释哪些FFMPEG设置可以/应该在所有平台(现代浏览器,Android和iOS)上工作,产生一个静态文件流,我可以发送到一个HTML5播放器.

@H_607_6@[编辑]如果没有通用选项我需要什么

@H_607_6@如果这是不可能的,因为一些帖子可能会建议,我希望看到一组FFMPEG设置,就mp4流媒体而言,可以正常完成工作. (例如编码可流式传输的mp4).

@H_607_6@流式mp4需要以下内容

@H_607_6@ @H_607_6@非常感谢您的帮助!

解决方法

没有可以在每个设备和浏览器上播放的格式. HTML5让我们更接近,但仍然存在关于格式和编解码器的争论.我在Zencoder的朋友有一篇新的博客文章博客文章( HERE),它解决了这个问题. @H_607_6@ @H_607_6@编辑:你要求更多细节.同样,它取决于您希望定位的平台.我会在这里报道几个.

@H_607_6@这应该适用于支持h.264编解码器的所有现代浏览器.它也应该在iPhone4及以上版本上播放:

@H_607_6@
ffmpeg -i ~/DropBox/Test\ Content/bigbuckbunny/bigbuckbunny_1500.mp4 -vcodec libx264 -profile:v main -b:v 512k -s 1280x720 -r:v 30 -acodec libfdk_aac -b:a 128k -movflags faststart -y movie1.mp4
@H_607_6@iPhone 3gs不支持配置文件,其最大支持分辨率为640×480.此命令将对此旧设备进行编码.

@H_607_6@
ffmpeg -i ~/DropBox/Test\ Content/bigbuckbunny/bigbuckbunny_1500.mp4 -vcodec libx264 -profile:v baseline -b:v 512k -s 640x432 -r:v 30 -acodec libfdk_aac -b:a 128k -movflags faststart -y movie2.mp4
@H_607_6@我编写了一些示例文件并在此处创建了一个网页:
http://szatmary.org/stackoverflow/18758133/

@H_607_6@HTML看起来像这样

@H_607_6@
<!DOCTYPE html>
<html>
<body>
<br>ffmpeg -i ~/DropBox/Test\ Content/bigbuckbunny/bigbuckbunny_1500.mp4 -vcodec libx264 -profile:v main -b:v 512k -s 1280x720 -r:v 30 -acodec libfdk_aac -b:a 128k -movflags faststart -y movie1.mp4<br>
<video controls>
  <source src="movie1.mp4" type="video/mp4">
  Your browser does not support the video tag.
</video>
<br>ffmpeg -i ~/DropBox/Test\ Content/bigbuckbunny/bigbuckbunny_1500.mp4 -vcodec libx264 -profile:v baseline -b:v 512k -s 640x432 -r:v 30 -acodec libfdk_aac -b:a 128k -movflags faststart -y movie2.mp4<br>
<video controls>
  <source src="movie2.mp4" type="video/mp4">
  Your browser does not support the video tag.
</video>
</body>
</html>
@H_607_6@这里的命令分解为每个元素的含义:

@H_607_6@命令输入文件(应该是显而易见的):

@H_607_6@
ffmpeg -i ~/DropBox/Test\ Content/bigbuckbunny/bigbuckbunny_1500.mp4
@H_607_6@使用libx264对视频进行编码:

@H_607_6@
-vcodec libx264
@H_607_6@将h.264配置文件设置为main.基线将允许在较旧的设备上播放,但你会牺牲一点质量:

@H_607_6@
-profile:v main
@H_607_6@将比特率设置为每秒512千比特.根据可用带宽选择一个值. LAN / WiFi更高,3G / LTE更低

@H_607_6@
-b:v 512k
@H_607_6@将视频缩放到720p分辨率(再次取决于目标平台)

@H_607_6@
-s 1280x720
@H_607_6@以每秒30帧的速度编码:

@H_607_6@
-r:v 30
@H_607_6@使用libfdk_aac对音频进行编码.或者如果你想要mp3,请使用libmp3lame.强烈推荐AAC.它在ios上有更好的支持,可以产生更高质量的音频:

@H_607_6@
-acodec libfdk_aac
@H_607_6@将音频比特率设置为每秒128千比特.您也可以根据带宽调整此值.使用AAC,你可能会低至32k

@H_607_6@
-b:a 128k
@H_607_6@将音频采样率设置为每秒48000个样本.如果使用mp3,请为ios执行44100

@H_607_6@
-r:a 48000
@H_607_6@这告诉ffmpeg将moov原子放在mp4文件的开头.

@H_607_6@
-movflags faststart
@H_607_6@输出文件(-y告诉ffmpeg它可以覆盖文件而不询问)

@H_607_6@
-y movie1.mp4

大佬总结

以上是大佬教程为你收集整理的node.js – 使用FFMPEG在浏览器中编码静态文件的交叉设备编码(分段h264?)全部内容,希望文章能够帮你解决node.js – 使用FFMPEG在浏览器中编码静态文件的交叉设备编码(分段h264?)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。