SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集

以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使SIMD特别适合于多媒体应用等数据密集型运算。

微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元,如X86中的SSE,AVX,Arm中的Beon,现在叫asimd。

在js运行环境中,目前还没有完美的线程方案来利用多核解码,那么我们可以优化至少让单核进行并行运算。这是chrome91和firefox89正式带来的WebAssembly SIMD技术。

NodePlayer.js 更新v0.10.1版,利用这项技术,在高分辨率解码环境下,带来比SISD性能提升1倍以上!尤其是在高分辨率,HEVC解码下。

测试对比:

首先准备一个hevc编码,2M码率,1080分辨率,30帧的视频

ffprobe http://192.168.0.3:8000/live/enc1.flv
ffprobe version 4.3.2 Copyright (c) 2007-2021 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.30)
  configuration: --enable-small --disable-doc --enable-libsrt --enable-libfreetype --enable-libspeex --enable-libx264 --enable-libx265 --enable-openssl --enable-gpl --enable-nonfree --enable-version3 --enable-libopenh264 --cc='ccache cc'
  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
Input #0, flv, from 'http://192.168.0.3:8000/live/enc1.flv':
  Metadata:
    encoder         : Lavf57.71.100
    server          : NMS v3.14.2
  Duration: 00:00:00.00, start: 91.998000, bitrate: N/A
    Stream #0:0: Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s
    Stream #0:1: Video: hevc, yuv420p(tv, bt709), 1920x1080, 2000 kb/s, 30.30 fps, 30 tbr, 1k tbn, 30 tbc

可以看出,WASM版解码cpu占用90.6% ,而SIMD版解码cpu占用42.3%,达到1倍以上的性能提升!

wasm 版在线demo:http://demo.nodemedia.cn/uploads/nodeplayer_wasm.html

simd 版在线demo:http://demo.nodemedia.cn/uploads/simd/index.html

NodePlayer.js 文档:https://www.nodemedia.cn/doc/web/#/1?page_id=1

原文地址:NodePlayer.js正式支持SIMD解码加速 | 诺德美地流媒体系统 (nodemedia.cn)

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: NodePlayer.js正式支持SIMD解码加速

关于Android5.0开放的Native-codec测试一文中有提到4.0通过OpenMAX AL接口实现硬解码。可以先从分析native-media这个sample开始,可以在ndk目录中找到。

  1. 首先调用Java_com_example_nativemedia_NativeMedia_createEngine ?创建引擎和output mix 对象。
  2. Java_com_example_nativemedia_NativeMedia_setSurface 将java层的Surface对象转为NativeWindow对象用于视频显示
  3. Java_com_example_nativemedia_NativeMedia_createStreamingMediaPlayer ?初始化data source、?audio sink、image video sink、media player等对象 ,注册AndroidBufferQueueCallback?StreamChangeCallback两个回调,调用enqueueInitialBuffers预填充部分初始数据。
  4. enqueueInitialBuffers中通过读取ts文件获取足够量的buffer用于初始化
  5. AndroidBufferQueueCallback 的注释:?register the callback from which OpenMAX AL can retrieve the data to play,程序回调这里说明可以读buffer开始播放了

继续阅读

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: Android 4.0以上系统硬件解码RTMP流的一种方式

阅读ffmpeg串流的手册FFmpeg Streaming Guide
当进行点对点串流
如果视频编码为H.264时,payload type 为 96

$ ffmpeg -re -i sample1.mp4 -an -c copy -f rtp rtp://127.0.0.1:12345

Output #0, rtp, to 'rtp://127.0.0.1:12345':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.48.100
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 424x240, q=2-31, 420 kb/s, 24 fps, 90k tbn, 24 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.48.100
m=video 12345 RTP/AVP 96
b=AS:420
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0LAHpZiA2P8vCAAAAMAIAAABgHixck=,aMuMsg==; profile-level-id=42C01E

此时会自动输出一段SDP的代码,这时候如果直接播放继续阅读

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: 使用ffmpeg进行rtp串流h.264时关于sdp的一些分析

安装配置Red5 Server 1.0 RC1 (一)中提到过一个Publisher 工具,非常好用。但是Red5官方一直没更新,只能使用flv和nellymoser编码。而现在大多使用H.264和Speex了。
近期为了方便调试,修改了下源码,可以在https://github.com/illuspas/Red5-Publisher找到。
直接使用Flash builder 4.6导入项目即可。
也可以直接下载release.zip使用
直接打开:http://www.nodemedia.cn/uploads/files/Red5-Publisher.swf

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: 支持H.264,Speex编码的Red5 Publisher

移动设备上的H.264实时视频编码,需要考虑到cpu占用与带宽这2个限制因素,使用X264软编码,开启neon指令集优化,即使是在arm处理器下,依然可以通过优化配置达到满意的性能.
以下测试环境 一段352×288@15fps的视频,模拟摄像头采集到的数据。ipod touch4 和昨天编译出的X264:
Touch-future:~ root# ./x264 -o video_1.h264 video_1.y4m –profile baseline –preset ultrafast –fps 15

baseline
ultrafast
encoded 467 frames, 48.17 fps, 865.45 kb/s 3368054(压缩后的文件大小,单位字节)继续阅读

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: Android,IOS平台上x264编码实时视频参数设置与优化

我的测试环境 Xcode 4.6 iPod Touch 4

Touch-future:~ root# uname -a
Darwin Touch-future 11.0.0 Darwin Kernel Version 11.0.0: Sun Apr  8 21:51:26 PDT 2012; root:xnu-1878.11.10~1/RELEASE_ARM_S5L8930X iPod4,1 arm N81AP Darwin

设置环境变量

export CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
export AS='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc'
export CFLAGS='-arch armv7'
export LDFLAGS='-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system/ -arch armv7'

配置

./configure --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/ --host=arm-apple-darwin  --enable-static --enable-strip --disable-avs --chroma-format=420 --enable-pic --disable-opencl

编译继续阅读

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: 开启neon编译iOS版X264

今天编译了raspberry pi 的一个例子hello_video
可以解码.h264文件输出到显示器
使用ffmpeg生成这种无容器的 raw H.264格式

ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.h264

就是将mp4这类 length prefixed mode 转为 start code prefixed mode

另外,pi的硬解码性能确实不错,播放1080P的视频非常流畅,GPU加速,几乎不占CPU

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: FFmpeg 生成.h264文件

上篇使用pipe播放流后,观看的同时,如需保存成文件,使用ffmpeg也是很方便的.
既然已经是标准H264了,那就不需要再编码,直接copy流再muxer

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

代码原型请看这个这个回复,不过他的代码中,视频输出流的AVCodecContext

AVCodecContext *c;
c = o_video_stream->codec;

缺少了extradata,造成生成的MP4文件avcC没有SPS PPS信息而无法播放

添加如下代码

c->extradata = i_video_stream->codec->extradata;
c->extradata_size = i_video_stream->codec->extradata_size;

另外不需要两次打开输入流,完全是可以在播放开始后任意时间来控制开始保存文件.
使用mp4封装,在Android IOS上均可调用系统自带播放器播放

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: FFmpeg取回标准H.264流后播放的同时存为MP4文件