Sipeed矽速科技
直播中

dutong0321

3年用户 588经验值
擅长:模拟技术 嵌入式技术 接口/总线/驱动 光电显示 控制/MCU RF/无线
私信 关注
[讨论]

【Longan Pi 3H 开发板试用连载体验】轻办公和直播开发研究

首先感谢发烧友william hill官网 和Sipeed举办的本次活动,我已经收到了Longan Pi 3H开发板了,Sipeed也是老朋友了,再次感谢对我的信任,感谢感谢。

项目计划

1.完成开箱报告,了解板子外设和操作系统,主要研究Debian系统。
2.打印3D外壳,使其作为日常Linux终端进行轻办公使用,同时进行软件的介绍。
3.使用GCC融合FFMPEG库进行API编程,目标是通过FFMPEG进行本地视频和RTSP流的RTMP协议直播。
4.创建RTMP服务流媒体服务器,可以保证使用其他电脑PC端通过RTMP和HTTP协议直接访问3H服务器进行观看直播。
5.重点突破全志的硬编解码开发,并成功融入到开发中进行使用。

开箱报告

依旧是顺丰快递到了的,打开以后泡沫袋保护的很好,然后就是熟悉的标志Sipeed,真的是太喜欢这家公司的板子了,外壳真的简约又大方。
01.jpg

上面写着板子的型号Longan Pi 3H,根据官方的介绍可知目前官方在Linux SBC主要有两个产品线,Lichee荔枝和Longan龙眼,荔枝系列是RISCV架构,龙眼是ARM架构,不过这是最近定的,因为有两个早期的叛徒LicheePi ZeroLicheePi Nano都是ARM架构的,哈哈O(∩_∩)O
盒子上面还标注了处理器为4核A53处理器,支持WIFI6和BLE5.4,真的是诚意满满,拥有千兆RJ45网口,两个USB2.0接口以及一个HDMI接口。
02.jpg

打开以后还有一层气泡袋进行了减震,更好的保护了板子,板子是分离的,核心板和底板都很小巧,做工都很不错,底板可以分为两组排针,一个Type C接口,两个USB接口,一个RJ45接口,一个HDMI接口,还有一个TL8800TCUA的WIFI模块,两个LED灯,具体的可以查看LPi3H_33081的原理图,在图上和介绍里其实你还会发现有TF卡,其实TF卡的插槽就在HDMI的背面,这也是为什么外壳的HDMI开口的上面还有一个开口的原因,如果不仔细看估计会不好找到。
io_map.jpeg

接下来再详细说说两组接口一组是DEBUG TTL的RX/TX/5V/GND,另外一组是GPIO口,具体的如上图所示。Type C是不仅仅有供电功能,还拥有OTG功能,两个USB-A口不用多说可以连接鼠标键盘,千兆网口使用的是自带变压器的,以前用的MilkV Duo和LuckFox Pico两款开发板自己增加网口的时候也是采用的HanRun的,只不过哪个是百兆的,最后还拥有HDMI接口。
03.jpg

翻过来背面就可以看到核心板了,最直接映入眼帘的就是三款芯片,分别是rs70b32g4,是一块容量为32G的EMMC芯片,接下来是全志的H618芯片,再下面就是RS1G32LO4,是一块DDR4的4G内存,资源给的是相当的丰厚。
04.jpg

先采用Type C进行供电,然后直接使用有线网络进行连接,然后连接鼠标、键盘和显示器。
05.jpg

然后就成功进入系统了,系统是我最喜欢的Debian系统,为了编码方便我的显示器是2K的显示器,但是可以看到系统成功识别正确,同样是采用的2K分辨率进行了显示,效果相当不错。
06.jpg

查看了一下内核版本,使用的是6.7,Debian系统采用的是最新的Debian 13系统,可以看到是sid,也就是所谓的不稳定版本,感觉有些激进了,查看了下源,已经使用了国内源,这下也省得自己进行改源了,还是不错的。
07.jpg

接下来输入htop,这个命令也已经自己带了,可以看到4核4G的配置。
08.jpg

使用df -h命令进行查看,可以看到32G的容量与我们所看到的芯片也保持了一致。

4核A53加4G内存,完全就是一台电脑的配置,关键是体积还这么小,功耗这么低,真的是退可以撸代码,进可以充当小型服务器,真的牛!

回帖(11)

dutong0321

2024-4-10 15:55:45
其实,早在我知道自己获得了Longan Pi 3H后,我就已经开始着手打印外壳了,Sipeed家的大部分板子都自己带有3D文件,所以,可以打开Sipeed家的官方下载站进行下载,Longan Pi 3H的下载站在这里,然后在里面选择05_3D_file就可以下载了,然后进行解压文件。文件解压完成后,里面其实是STEP文件,这个文件有的3D打印机会认,有的则不认,我的那个打印机就属于不认的那种,于是我用SW2020转换成了STL格式进行切片后进行了打印。
10.jpg


打印很快就完成了,因为当时我还没有收到开发板,所以当我拿到打印完成后的壳子真的感觉太厉害了,开发板竟然做到了这么小,真的是太棒了。
11.jpg

然后,翻到正面就可以看到外壳上面写的LonganPI-3H,真的很小巧,不过在我要安装的时候就给把壳子弄坏了,大概是因为我的打印机采用的是FDM打印机,所以抗形变能力真的很差,不过后来我用3D Builder稍微进行了一些修改,然后就安装成功了。

12.jpg

板子从上面查看的样子,里面的内容一览无遗,板子其实最主要怕的就是短路和静电了,所以弄个板子还是一个非常不错的选择,上面其实是有一个固定的边框的,即可以固定,又可以保证散热。

13.jpg

接口这面还是非常不小心的把网口和USB口之间的立柱碰掉了,自己动手能力不好,所以美观方面大打折扣。不过我最近在发烧友william hill官网 看到另外一个大神自己做了个STL,那个就比较适合FDM打印机去打印了,如果手里有FDM的,又不在意全包住的可以看一看他的,链接在这里

14.jpg

外壳就先说到这里,再说说轻办公,轻办公的定义我觉的可以简单的编写一些小程序,写个文档,使用chromium浏览个网页就OK了,这些龙眼派都可以轻松做到,更加繁重的工作就不要难为他了。但是如果有一台云电脑,或者你办公室的电脑24小时不关机又恰好有公网IP,那么,这个问题就可以轻松解决了,作为一个写代码画板的,你的电脑不会每天都开关机吧?既然需要远程,那么就可以看看Remmina这个软件咯,首先使用APT来搜索一下remmina,然后就可以找到一个RDP的插件了,如果要远程Windows,那么就需要这个协议插件了。

15.jpg
  1. sudo apt install remmina remmina-plugin-rdp
输入以上代码就可以轻松进行安装了。
16.jpg

打开软件后,首先输入Server,其实就是IP地址和端口号。


17.jpg


然后往下翻翻选择分辨率,这里的分辨率最好选择成Use client resolution,就是跟随客户端的分辨率,就像客户端的分辨率如果是2560x1440,那么我们远程的分辨率也就是2560x1440了,看起来就非常舒服了。


18.jpg

然后选择Advance,在Advance中的Quality中选择Good,这个其实是选择质量,质量越高需要的流量越高,画面越好看,因为不差流量,所以不要折磨自己的眼睛了,直接选择GOOD就好了。

19.jpg

这就是最后的效果了,可以看到在派上已经成功连接上我的主机了。分辨率就是我显示器的分辨率2560x1440,还需要注意的一个地方,如果打开以后没有自动全屏,需要自己进行点击一下按钮才会全屏的。

1 举报

dutong0321

2024-4-17 10:23:56
本帖最后由 dutong0321 于 2024-4-17 10:30 编辑

我突然发现,我还没有写板子的初始用户名和密码,其实这个可以从官网上面可以找到的,用户名是sipeed,密码是licheepi,虽然使用图形界面不需要每次输入密码,但是使用sudo命令时肯定是难免需要的,这次的主要更新是要在板子上搭建好ffmpeg的开发环境,并测试接收RTSP流,推RTMP流,采用SSH来进行远程登录,后期呢,主要的研究方向在硬解和硬编两方面。
首先还是需要安装软件,输入命令:
  1. sudo apt update
  2. sudo apt install ffmpeg gcc g++ ffmpeg-doc  libavcodec-dev  libavcodec-extra  libavdevice-dev libavfilter-dev libavfilter-extra  libavformat-dev libavformat-extra libavutil-dev libpostproc-dev libsdl-kitchensink-dev libswresample-dev libswscale-dev
安装完软件以后,接下来就要进行的是写代码,测试代码还是我在爱芯派评测中的代码:
  1. #include
代码一会儿我以附件的方式再传一下哈。
接下来就可以通过命令来编译了,只有一个文件也没有必要整makefile了。
  1. gcc -g -Wall ffmpeg.c -o ffmpeg -lavformat -lavfilter -lavcodec -lavutil -lswresample -lswscale -lm -lpthread -lrt
一个警告都没有的执行完毕了,接下来试试执行!

20.jpg

然后就开始进行执行,执行文件后就可以看到编解码信息了。
21.jpg

最后,来看看执行的效果,使用VLC来查看rtmp流的信息。
22.jpg



可以看到也是可以正常播放的,这就代表FFMPEG的开发环境已经安装无误了,这种方式是使用板子进行安装编译的,这也说明板子的性能还是非常不错的,在上一期我就说过板子上进行一些简单的代码开发也是没有问题的,下次的研究方向就是硬解码硬编码!
对了,还有代码的附件。
ffmpeg.zip (1.56 KB)
(下载次数: 0, 2024-4-17 10:23 上传)







举报

dutong0321

2024-4-17 14:35:53
代码可以通过下载附件进行解压后查看,我查看了一下刚刚写好的代码发现只有一行,可能有的大佬懒的下载附件,所以,我重新传一下代码。
  1. #include
  2. #include
  3. #include
  4. #include "libavcodec/avcodec.h"
  5. #include "libavformat/avformat.h"
  6. #include "libavfilter/avfilter.h"
  7. #include "libavfilter/buffersink.h"
  8. #include "libavfilter/buffersrc.h"
  9. #include "libavutil/avutil.h"
  10. #include "libavutil/audio_fifo.h"
  11. #include "libavutil/mathematics.h"
  12. #include "libswscale/swscale.h"
  13. #include "libavutil/imgutils.h"
  14. #include "libavutil/time.h"
  15. #include "libswresample/swresample.h"
  16. const char input_link[] = "rtsp://admin:a1234567@192.168.1.65:554/h264/ch1/sub/av_stream";
  17. const char output_link[] = "rtmp://192.168.1.1:8910/rtmplive/cctv";
  18. const int width = 640, height = 480, fps = 10;
  19. int main(int argc, char* argv[]) {
  20.         int        i_video_output_stream = -1;
  21.         int64_t i_video_frame = 0;
  22.        
  23.         avformat_network_init();
  24.        
  25.         AVPacket *packet = (AVPacket *)av_malloc(sizeof(AVPacket));
  26.        
  27.         AVDictionary* options = NULL;
  28.         av_dict_set(&options, "max_delay", "200000", 0);
  29.         av_dict_set(&options, "stimeout", "1000000", 0);  //设置超时断开连接时间
  30.         av_dict_set(&options, "rtsp_transport", "tcp", 0);  //tcp方式打开
  31.        
  32.         AVFormatContext *p_video_input_format_ctx = avformat_alloc_context();
  33.         AVStream *p_video_input_stream = NULL;
  34.         if (avformat_open_input(&p_video_input_format_ctx, input_link, NULL, &options) != 0) {
  35.                 printf("error: input stream open fail!");
  36.                 return -1;
  37.         }
  38.         if (avformat_find_stream_info(p_video_input_format_ctx, NULL) < 0) {
  39.                 printf("error: couldn't find stream information.\n");
  40.                 return -1;
  41.         }
  42.         for (int i = 0; i < p_video_input_format_ctx->nb_streams; i++) {
  43.                 if (p_video_input_format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
  44.                         p_video_input_stream = p_video_input_format_ctx->streams[i];
  45.                         break;
  46.                 }
  47.         }
  48.         if (p_video_input_stream == NULL) {
  49.                 printf("error: couldn't find video stream.\n");
  50.                 return -1;
  51.         }
  52.         printf("----------Video Input Information----------\n");
  53.         av_dump_format(p_video_input_format_ctx, 0, NULL, 0);
  54.         printf("-------------------------------------------\n");
  55.        
  56.        
  57.         AVFormatContext *p_output_format_ctx;
  58.         if (avformat_alloc_output_context2(&p_output_format_ctx, 0, "flv", output_link) != 0) {
  59.                 printf("error: avformat_alloc_output_context2!\n");
  60.                 return -1;
  61.         }
  62.        
  63.         //添加视频流
  64.         AVStream *p_video_output_stream = avformat_new_stream(p_output_format_ctx, NULL);
  65.         if (!p_video_output_stream) {
  66.                 printf("error: avformat_new_stream failed!\n");
  67.                 return -1;
  68.         }
  69.         if (avcodec_parameters_copy(p_video_output_stream->codecpar, p_video_input_stream->codecpar) < 0) {
  70.                 printf("error: avformat_new_stream failed!\n");
  71.                 return -1;
  72.         }
  73.         //附加标志,这个一定要设置
  74.         p_video_output_stream->codecpar->codec_tag = 0;
  75.         ///打开rtmp 的网络输出IO  AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。
  76.         if (avio_open(&p_output_format_ctx->pb, output_link, AVIO_FLAG_WRITE) != 0) {
  77.                 printf("error: avio_open failed!\n");
  78.                 return -1;
  79.         }
  80.         //写入封装头
  81.         if (avformat_write_header(p_output_format_ctx, NULL) != 0) {
  82.                 printf("error: avformat_write_header failed!\n");
  83.                 return -1;
  84.         }
  85.         for (int i = 0; inb_streams; i++) {
  86.                 if (p_output_format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
  87.                         i_video_output_stream = i;
  88.                 }
  89.         }
  90.         printf("----------Output Information----------\n");
  91.         av_dump_format(p_output_format_ctx, 0, output_link, 1);
  92.         printf("-------------------------------------------\n");
  93.         while (1) {
  94.                 if (av_read_frame(p_video_input_format_ctx, packet) >= 0){
  95.                         packet->stream_index = i_video_output_stream;
  96.                         packet->pts = av_rescale_q_rnd(packet->pts, p_video_input_stream->time_base, p_video_output_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
  97.                         packet->dts = av_rescale_q_rnd(packet->dts, p_video_input_stream->time_base, p_video_output_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
  98.                         packet->duration = av_rescale_q(packet->duration, p_video_input_stream->time_base, p_video_output_stream->time_base);
  99.                         packet->pos = -1;
  100.                         if (av_interleaved_write_frame(p_output_format_ctx, packet) < 0) {
  101.                                 printf("error: av_interleaved_write_frame failed!\n");
  102.                         }
  103.                         av_packet_unref(packet);
  104.                         i_video_frame++;
  105.                 }
  106.                 usleep(10000);
  107.         }
  108.         return 0;
  109. }
举报

dutong0321

2024-4-22 16:43:31
上次传完代码后,发现开始的三个头文件还是没有上传成功,反正也就是stdio之类的头文件,也就懒的补了,不然感觉在水帖子,然后再说说这次遇到的问题,本来这次打算做H618的硬编码的,但是失败了。
我在上次研究全志、瑞星微的硬编码时,收集到了全志的一个“V40, A31s, A80, A33, H3, H8 全志H264硬编码资料”的一个资料包,一般来讲同一个厂家的硬件编解码一般是差不多的,所以我就依托这个资料包试着对H618进行了开发,但是在开发以后发现打不开编解码的硬件加速设备,然后我就查看了一下/dev下的设备发现并没有注册编解码的硬件加速设备,我开始怀疑是不是固件有些老,或者Linux主线有些太新或太久,于是我打开了全志的H618网站H616,虽然写的是H616,但其实H618是H616的升级,所以这个可以完全当成是H618的网站,然后我就看到了令我头皮炸裂的消息:
30.png
是的,你没有看错,在video engine处写着patches exist somwhere?,那个灵动的问号代表了这句话的意思是可能在某些地方拥有补丁,然后我抱着不死心的想法,去友商那里看了一下,同样太难受了:
31.png
也就是说,目前来讲,视频的硬编解码只能再稍微等等了,所以接下来,我的开发重点可能会转到QT上面,然后硬编解码这块会等待全志支持后继续进行。
顺便提一下全志的H3硬编码的例子可以参考:h264_encoder_H3
还有这个:cedrus

举报

更多回帖

发帖
×
20
完善资料,
赚取积分