咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

1. 文件操作

【mp4parser】 这个库提供了用于读取、写入和创建MP4文件的Java API,包含三个组件:

  1. isoparser
  2. muxer
  3. streaming

我用了muxer,将H264文件和AAC文件合并为MP4文件。

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.mp4parser/muxer -->
<dependency>
<groupId>org.mp4parser</groupId>
<artifactId>muxer</artifactId>
<version>1.9.41</version>
</dependency>
阅读全文 »

go get下载包失败在国内是常见的问题,下面是通过设置代理的解决方案

Go 版本是 1.13 及以上 (推荐)

1
2
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.io,direct

Go 版本是 1.12 及以下(实测1.14用这个方法也可以)

1
2
3
4
5
6
7
8
9
10
11
12
13
$ vim /etc/profile   (全部用户生效)
# 或者
$ vim ~/.profile (当前用户生效)

export GO111MODULE=on
# 七牛云赞助支持的
export GOPROXY=https://goproxy.cn
# 阿里云
#export GOPROXY=https://mirrors.aliyun.com/goproxy/
# goproxy.io
#export GOPROXY=https://goproxy.io/

$ source ~/.profile
阅读全文 »

RTP Over UDP

这是rtmp-rtsp-stream-client-java发出的包

1
80600396000cf6ae0ce9d37f|我是分隔符|7c85b8141ff1c6921a6ba385c00040056dd92a7ccbeb7e38000837470001067fff1fc3177b46c9c731d84f1e6b6f6ff6fc763b09e21dfe9df6dbc8b84f176dbfe9db4d3b68efff8f1c444b8fca76b5da32e13cda7476ffff477fc47e3c53ebad78fc20f47edf6fe3ffa3fffff3ff043afe1edee6b04a600b730c899d05e4d4dffba8ba5f3adab44c59e08ded760e63763eda138901d3c527ffedff09e0854eb3b7ffe3bef09fd013dfb7ffe9be1d7a32430a449f19848276060df0f31fe941ff8a8976a7039b22b8d910300043c1c004254905641cf077c3c9ed77812f89043040be9a437b35b520bf448436f46f48c000401817b8f391571dc96f9f8515c3225034d14963b27feab77e6a3e8e7722e93bf6bda10b439fbee0f8afa2887e21c776f75fb8c50fff9f50caa27ddf2f17de9e690f29a9780eef43e6b031805184fce2e27feb480fb577381cace9e2bbaf378354bd524c3a3c45812dc55528ee47b8a78ab2f228bddf5372c7964bd0781f5cb673f2dbd45cfe8fc00e8675e64aaca76d34cdbaa6993c69c69c5df77bb0cf48a7ba41457cb8f6d42728128ecd69f2d1b7fdbffc89e3ebe78cbbe90bb557dc8fa006e3e8593fb7f5d3b65a8347e7ffd757e21558f4b17ac009c887912807061fdc1d87e56cfffcd951823d6e8d28060f7038a1605115c154bc0bcec0e77cfbc17ae34e6cf9b2b7641dd1f4e3e5dfff0f060a7bf595121372efffdbd2de14a9c908826749655109894930c25b0cb20fc30327a7ffc2b8973fff6e54b221f641354a50ffffe8e7485551a7fffca8c832481117a78fffdb6d05fd3edf171153a44cb24d580c9862259a3152f54e1565d4694eda2a32519e5ffbbfa88afe7cd956bd2f516f74fffa21042c4e12421c2112488a2a11b4da4055a564a7b022561f103175bd441f8f73fc3d4474f8e62d71bc4c1dc6c6cd295df1690870f73aa0efad48c09f7ec5203c0954554ba7f0a312006e3bd03fbacf6ff9518c1ed5bccb3c49106c150b6bc14c5216e9ab42bfb48cb8d958eb59641482a2946928541f04f49fd74e3b4ea8e67b78147940b2d3813f275f5744028cad6a0d27369bd6b8e6ddf4ae5ea34ac977795b69afa9888a2dc7c657b8428e7f510f971c3d035d0ee31ee67a6185555ceb6610c896d16c32cd8c857bedf56aaf58a49a1e68f28875bedf4bd083601f0ada56fffffe7d61d07fd650b7e045246963c6aa9d28ed1ccf9e37c584401664a2f8e92c711f055b7b52d9d89dc02f7e48280553ca1c2d52cf20159a824cb6fb7eb60971384a9ff7b954807714fcb880952c102ed4fd32af30ce6032668ad447dfae2425f10c04dfcfea34116c1565385b99728679581c8d23dbb18bdf90abeae6fbfa94ca18f486feb34d660bec5c5d76b54db986731a0857db65250c82d293b16060802c1c1037464d9b3709ecf5b770ca586800821738c93c4588a64b80d33292b3ec07c461c7e840bda57c18f4403615df6de9012a2b60b7e066105e60f30aee1506dbc2c4f2b8c89201b293a8fa61dd3d3804498c8c48643c80724573fb77238f65116824d336be409c8ec6a290344368394a6bd00a5872d4107ff54b09eb398c061f5e0c81283da0afdbf06686a383fab987254b835d095f2cabcbe0eaae9c4c03d7286ada203e607156d0d3a9b6f9f9a0034211effb7c0392a47214afbef9ffda37102e821292af133105d4c33b5ddbf0b1ba4e609422f878e94831e6f6909391292a41daafd076146581226a148afcfa1395062fa8

分隔符前面是 rtp header 后面是 rtp payload 也就是H264的NAL,这部分可能有三种情况:单NAL,聚合NAL,分包NAL

FU-A
阅读全文 »

抓包文件在附件中…

一、Play 抓包 Over TCP

  • 推流Client端rtmp-rtsp-stream-client-java
  • server端EasyDarwin
  • 播放Client端 Javacv 录制( 这里用Wireshark抓包

tcp追踪流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
OPTIONS rtsp://192.168.0.223:554/test/ RTSP/1.0
CSeq: 1
User-Agent: Lavf58.12.100

RTSP/1.0 200 OK
CSeq: 1
Session: PoC0zKnGR
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD

DESCRIBE rtsp://192.168.0.223:554/test/ RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.12.100
Session: PoC0zKnGR

RTSP/1.0 200 OK
CSeq: 2
Session: PoC0zKnGR
Content-Length: 444

v=0
o=- 0 0 IN IP4 127.0.0.1
s=Unnamed
i=N/A
c=IN IP4 192.168.0.223
t=0 0
a=recvonly
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;sprop-parameter-sets=Z0LAHtoHgUSAeEAhUA==,aM48gA==;
a=control:trackID=1
m=audio 0 RTP/AVP 96
a=rtpmap:96 MPEG4-GENERIC/32000/2
a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1290; SizeLength=13; IndexLength=3; IndexDeltaLength=3;
a=control:trackID=0
SETUP rtsp://192.168.0.223:554/test/trackID=1 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
CSeq: 3
User-Agent: Lavf58.12.100
Session: PoC0zKnGR

RTSP/1.0 200 OK
CSeq: 3
Session: PoC0zKnGR
Transport: RTP/AVP/TCP;unicast;interleaved=0-1

SETUP rtsp://192.168.0.223:554/test/trackID=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
CSeq: 4
User-Agent: Lavf58.12.100
Session: PoC0zKnGR

RTSP/1.0 200 OK
CSeq: 4
Session: PoC0zKnGR
Transport: RTP/AVP/TCP;unicast;interleaved=2-3

PLAY rtsp://192.168.0.223:554/test/ RTSP/1.0
Range: npt=0.000-
CSeq: 5
User-Agent: Lavf58.12.100
Session: PoC0zKnGR

RTSP/1.0 200 OK
CSeq: 5
Session: PoC0zKnGR
Range: npt=0.000-

#这是紧接着一帧一帧rtp包(rtp over tcp)
701ce71cfb29c8ff28ed6843080045000524c1c240004006f1c3c0a800dfc0a8001e022ae383d37e23f074458e0a501800feecab0000240004f88060447500bd14102e9f0a407c85b803f06fe00f0e157e880381bc15565f8c35982ddba36a0312c81fd3800a814eb570c928a7818974f2303f010e39d505ae59ae3ebb42bbe706078d36e0997a0e00020011c000fff70000fea1d04f4480006968249f20dad1f9b600a5b19018a3c169c190e22c754f401f5cb5f3a4fa0736d00d6cbcb19670584cc24d248c1c51ef552de01e01807565e81e0ce8185fc160dbbeea53228011496146e44add661440a93ca0b20a0e6b2455413b9964320ed088f5cb751a24effc030f6b65c1d423a60fcf96247b9e7de03c0ef60020a1d76ad07eab06ad7584bfea63cfc9f5af1516029898299d30daa09cbff265002a099de41d7fa2262cc9a2957e885747b2bfd24b95583fd2007b1dc8060c63d0f9cb6000201a7968ad6b1eb03fc4932ee1efbc13b7a1ef52167acab89f939b0d039dad33c4b541c6ee759e541591f309071a007c130ffd1801818830226664c4db87bc2a00342111c8a630a654263ac5856721e37ed483ab31f8fa7a6797d9135039ffdfffa121bf11d0f440a84cbf443d5c9edd00010114f1c8298d5ad50b189ec1da94250a4826c50f3620d9da18cdffffb8ea614710240104fe5fa6886924bcc0d76987aa095427a80a08e13f0b935ca244c4ed4ff43b4ce7cd881a403cf8932bbffff695047712c3e0b19448ad5405308200306a59632f0a50e9a7a488da16040ece88915077f4299c947fff0794c028eba019c1036e548ce347af0cc3b1a18448fbaca4a4adaa8efd7b06f5be2dc1e7daec2ca97e2070654438fc5fe8dd06e0d30400f6fa7e09acc0c889df44c0a9cfda3c70f1cd3e0c9adcb6e208141e03bdfafd780400a3a3bf0f72fab2f7df9f8d0c701ff82c2105b6e2bcd85ea95fba2f79bbfd03539e2b4c412951d0bd4bf0581855cbcff519f54bd70d41c3b0a2f9bbe5fcf8aae3e87146bbe3c793a202ec6a5f5524a38c7fa7b6df5e90476add0f23a1539f71a2bdb6928320a0a01bdeb58527002d97c3826fcfdf7a6dc9e9a79909d71489e700531cc90d2f252aa97a97e9c1431a76fa785f03b42e60ee9f97fa6dedd63450c29b6f4d34fe3eb5c6b1d556ec510f6b6e6c8e31fede9a7ddfa939b8a9ad15b07e1e911cf2b358b776ee90de750f21b78eb8ad4ecc9c9859576c89856d2238b2feb87ca0a07f5f98bd655755bf2f6e66cb13c5b9cda6b50d605ddc4921c7a69f6fcf80aac42aaac56d5c98d6ec6b9f1e90d3183e9fc46623829bfef4b37de2d6d6d170c862ada69edb71f7723a98e6ad4bd289f42dfcb9cd90dd43cfdbd530a4e028320cdc846dd36e9ff6db77ffb8be74a93c98cce6c37ee9ca9ff1abd7d33b92dddd4d8ffaf2e0b703c21c342837a3460a8fe2002dae062608045068ace00a404e19d8d080527c354e368ce82406ab26eb61b0018c3b9991b036c07153560b53840bd0398c01e01e1c129b5b2e0efc55e32bae349338fa42a8a8c31427df5c18abc6f2f36aae5b55c78a648a6b4e3fdacd931184ea59d1e64cda61c0c0b2fb65e3ab07d70ff4b8988488acf3b25d56fa3039c123b28eff95e380c8dee9530e128920d476f47b28867b80fbb4e96af68a781b7e8bb9663c0130f8f752c7c9bbea0090e3e99b7797ff124528fc31a950e5fc651b85bdedf5ea5daa5ca41e2c2e7940ecb8e58448133afe9acaa6fb63badd2930240346a6eeda99aabb44822a41351c75d0725e36ad4d1fdc1086dbb9e6a5ee416d2df2ee372317b9541c6612d94cbb61357b2be0e37f981772c3880e02e2f4cc47e866
阅读全文 »

Live555提供HTTP/RTSP协议的多媒体流服务器和RTSP流代理中转。

下载源码编译

需要g++编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ wget  http://www.live555.com/liveMedia/public/live555-latest.tar.gz
$ tar -xzvf live555-latest.tar.gz
$ cd live
$ ls
BasicUsageEnvironment config.iphoneos config.solaris-32bit liveMedia
config.armeb-uclibc config.iphone-simulator config.solaris-64bit Makefile.head
config.armlinux config.linux config.uClinux Makefile.tail
config.avr32-linux config.linux-64bit configure mediaServer
config.bfin-linux-uclibc config.linux-gdb COPYING proxyServer
config.bfin-uclinux config.linux-no-openssl COPYING.LESSER README
config.bsplinux config.linux-with-shared-libraries fix-makefile testProgs
config.cris-axis-linux-gnu config.macosx genMakefiles UsageEnvironment
config.cygwin config.macosx-no-openssl genWindowsMakefiles win32config
config.cygwin-for-vlc config.mingw genWindowsMakefiles.cmd win32config.Borland
config.freebsd config.openbsd groupsock WindowsAudioInputDevice
config.freebsd-no-openssl config.qnx4 hlsProxy
$ ./genMakefiles linux-64bit #linux-64bit这个参数是config.<后缀>获取得到的,是编译的目标平台
$ make

启动服务

阅读全文 »

目标

这次要编译一下FFmpeg的Android平台,采用版本v4.4.2,高版本有对 --target-os=android 支持,配置没那么麻烦。

环境

以前编译【ijplayer】库已经配置好环境,这次就在这个环境下编译:

  • Ubuntu 20.04
  • NDK 采用新的版本 21.3.6528147
  • FFmpeg-4.4.2
阅读全文 »

通过HTTP无法播放MP4视频?

有一个摄像机录制的视频文件record.mp4 ,放在web服务器上边下边播(http://mydomain.com/record.mp4 ),发现无法播放,下载到本地可以播放。
但是从抖音下载的视频douyin.mp4文件,同样放在web服务器上,可以边下边播(http://mydomain.com/douyin.mp4 )能正常播放。

都是MP4封装格式 ,这两个文件有什么不同呢?

通过 Mp4Explorer 这个软件,可以查看MP4的详细信息。

moov 是box参数列表,可以粗暴理解为 配置信息
mdata 是音视频数据

阅读全文 »

RTSP推流到本地

用UDP传输

1
2
3
4
5
6
$ ffmpeg -re -i h264.mp4 -vcodec copy -f h264 udp://127.0.0.1:8554

#循环文件推流(默认UDP)
ffmpeg -re -stream_loop -1 -i move.mp4 -vcodec copy -codec copy -f rtsp rtsp://192.168.0.223:554/test/
#循环文件推流(指定TCP)
ffmpeg -re -stream_loop -1 -i move.mp4 -vcodec copy -codec copy -rtsp_transport tcp -f rtsp rtsp://192.168.0.223:554/test/

在本地用ffplay播放(ffplay是ffmpeg的附带命令行工具)

1
2
$ ffplay  udp://127.0.0.1:8554
$ ffplay -f h264 udp://127.0.0.1:8554
阅读全文 »

由于项目【ijkplayer】提供编译好的库没有支持RTSP,而ijkplayer这个项目比较强大之处就是可以根据需要进行裁剪编译,所以我要自己编译一次Android版本,开启RTSP协议。

一、软件环境

  1. Ubuntu16.04 Server
  2. Android SDK
  3. NDK(不要安装最新的版本,14b版本能用)和cmake
  4. ijkplayer-k0.8.8 (commit cced91e3ae3730f5c63f3605b00d25eafcf5b97b)
  5. 其他一些编译c的环境,系统本身就有,就不一样列出。

编译所需软件大概有这些,引用参考文章的

1
2
$ sudo apt install vim openssh-server git curl wget tar unzip
$ sudo apt install build-essential openjdk-8-jdk yasm python
阅读全文 »

问题

在《VMWare为Ubuntu添加硬盘》一文中,我尝试为虚拟机增加一块磁盘挂载了 /data 路径下,这可以解决在“出现磁盘耗尽预警”之前增加磁盘,尽量将新的文件都放到 /data 路径下。

如果应用的数据无法迁移,需扩展根分区 / 的空间, 上面的方法则无法满足我的需求。

GParted

对于VMWare虚拟机,还可以考虑对虚拟机磁盘进行扩容,如:

阅读全文 »

CD/DVD 驱动器的类型:

  1. 如果选择操作系统为XP的话,CD/DVD 驱动器默认是IDE类型。
  2. 如果选择操作系统为Win7的话,CD/DVD 驱动器默认是SATA类型。

CD/DVD 驱动器底下有一个“高级”按钮,可以修改驱动器的类型。


VMWare中的Ubuntu虚拟机当初创建时只分配了20G硬盘,结果现在硬盘爆满了,记得VMWare可以加硬盘的,所以给它加了一块虚拟硬盘,记录一下过程。

  1. 添加虚拟硬盘

VM关机,在“编辑虚拟机设置” 中“硬件”给虚拟机实例添加一块硬盘。

  1. 开机进入Ubuntu(这里是root身份登录,所以命令没有加sudo)

查看所有的硬盘,其中 /dev/sdb 是我们的第二块硬盘。

阅读全文 »

升级到VM15后,在网上下载Windows7 、 XP的Chost镜像,一直提示“CDBOOT: Couldn’t find BOOTMER”,修改VMWare虚拟机的BIOS第一启动项为CD依然不行。

安装Linux系统(Ubuntu 20.04)却很顺利的。

查看下载的镜像文件,原来是没有boot.ini文件

很简单,将虚拟机关机,在菜单栏“启动”绿色按钮旁边的更多三角形按钮,可以看到最底下有一个选项“打开电源时进入固件”,点击就可以进入BIOS啦。

国内 git clone github上的仓库一直不快,但现在很慢,经常超时,发现一个镜像加速站点: github.com.cnpmjs.org

如:

1
2
3
4
5
$ git clone https://github.com/bilibili/ijkplayer.git

# 改为

$ git clone https://github.com.cnpmjs.org/bilibili/ijkplayer.git

速度体验符合预期!!!

而且 github.com.cnpmjs.org 也可以网页浏览,但不可以登录。

阅读全文 »

Ubuntu下安装配置Android命令行编译环境,用于Jenkins编译项目和NDK编译第三方so库。

安装命令行工具sdkmanager

  1. 【在下载页面】 下载
    【commandlinetools-linux】 至路径 /usr/local/androidsdk
  2. 解压到当前目录,命令行工具的目录是 cmdline-tools
  3. sdkmanager是可执行文件
1
2
3
4
5
6
7
8
9
10
11
12
$ cd cmdline-tools/
$ ls
bin lib NOTICE.txt source.properties
$ tree bin
bin
├── apkanalyzer
├── avdmanager
├── lint
├── screenshot2
└── sdkmanager

0 directories, 5 files

配置环境变量

阅读全文 »

https://github.com/latelee/H264BSAnalyzer 是一个Win程序,用于分享H264文件,已有打包好exe的文件。

打开一个H264文件,如图

可以看到这个软件已经把每一个Nal解析为一行一行的,H264文件就是以Nal为单位。

一个H264文件,开头的是SPS和PPS,SEI可有可无,然后就是I帧,再就P帧或者B帧。

每一帧都会有一个start code,H264BSAnalyzer 是将 00 00 00 01 + FNRIType(第一个字节) 作为 start code 。

阅读全文 »

这是两种常用的音视频推流协议,这里简单比较一下两种协议应用场景(本文适合Java、Android开发者)。

参考:

一、RTMP

Real Time Messaging Protocol(实时消息传输协议)是 Adobe 的私有协议,设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

阅读全文 »

1. 二进制文件下载(推荐)

Ubuntu直接下载deb包 ,用 dpkg -i 安装。

注:Ubuntu或者其他版本的linux,也可以下载Linux Static Builds 可执行文件 , 放在 /usr/bin 目录下,修改权限为可执行(777)即可。

2. 命令安装

1
2
3
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg
阅读全文 »

在做Android 系统OTA升级App时,需要在 ‘/cache‘ 目录创建目录和脚本文件,App已经获取到system权限(安装到 /system/priv-app 目录),但是还是在/cache 目录下没有权限。

通过 adb 命令,用system身份执行命令都没有任何问题。

升级命令脚本是:

1
2
3
"mkdir /cache/recovery"
"echo \"--update_package=/data/update.zip\" > /cache/recovery/command"
reboot recovery

但建议调用Android的接口 RecoverySystem.installPackage(this,new File("/data/update.zip")); 执行(也是差不多这些命令)

阅读全文 »