工程建设指挥部网站小程序从哪里登录

pingmian/2026/1/24 7:47:31/文章来源:
工程建设指挥部网站,小程序从哪里登录,长沙楼市最新消息,网页设计网站开发需要哪些知识上次已将ffmpeg的动态库编译出来了#xff0c;并且使用了ffmpeg的转码功能#xff0c;成功将mp4格式视频转化为yuv视频#xff0c;这篇文章基于上次测试的demo#xff0c;使用surfaceview显示解码完成的像素数据 布局设置和权限添加 布局 FrameLayout xmlns:android并且使用了ffmpeg的转码功能成功将mp4格式视频转化为yuv视频这篇文章基于上次测试的demo使用surfaceview显示解码完成的像素数据 布局设置和权限添加 布局 FrameLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent com.cj5785.ffmpegnativeplayer.view.MySurfaceViewandroid:idid/surface_viewandroid:layout_widthfill_parentandroid:layout_heightfill_parent/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text开始android:onClickmPlay //FrameLayout权限 uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.MOUNT_UNMOUNT_FILESYSTEMS /编写自定义view和控制器 自定义View package com.cj5785.ffmpegnativeplayer.view;import android.content.Context; import android.graphics.PixelFormat; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView;public class MySurfaceView extends SurfaceView {public MySurfaceView(Context context) {super(context);init();}public MySurfaceView(Context context, AttributeSet attrs) {super(context, attrs);init();}public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}//初始化像素格式private void init() {SurfaceHolder holder getHolder();holder.setFormat(PixelFormat.RGBA_8888);} }控制器 package com.cj5785.ffmpegnativeplayer;import android.view.Surface;public class NativePlayer {public native void render(String input, Surface surface);static {System.loadLibrary(avutil-54);System.loadLibrary(swresample-1);System.loadLibrary(avcodec-56);System.loadLibrary(avformat-56);System.loadLibrary(swscale-3);System.loadLibrary(postproc-53);System.loadLibrary(avfilter-5);System.loadLibrary(avdevice-56);System.loadLibrary(ffmpeg_native_player);}}实现控制器native方法 使用javah生成头文件这里可能存在无法找到Surface签名的问题这时候需要指定classpath路径javah -classpath E:\eclipse-adt\sdk\platforms\android-15\android.jar;. com.cj5785.ffmpegnativeplayer.NativePlayer 格式说明-classpath后面跟的是android.jar路径最后接native方法类的全名 新建jni文件夹将头文件移至jni文件夹添加本地依赖 复制生成ffmpeg的include目录和so动态库到jni目录 将之前的Android.mk和Application.mk复制到jni文件夹并做适当修改Android.mk主要修改模块名使其与控制器调用相统一Application.mk主要将APP_PLATFORM : android-8修改为APP_PLATFORM : android-9 注意此处如果不修改Application.mk将导致android/native_window_jni.h无法找到同时由于使用了这个头文件需要在Android.mk配置-landroid 使用开源库libyuv实现yuv转化为RGBA_8888 下载开源库libyuv下载地址libyuv下载地址 将libyuv下的所有文件放入jni目录(NDK工程规范必须存在jni目录) 修改libyuv的Android.mk文件将最后的include $(BUILD_STATIC_LIBRARY)改为include $(BUILD_SHARED_LIBRARY)这样就可以生成so动态库了 还可以将LOCAL_MODULE : libyuv_static改为LOCAL_MODULE : libyuv方便so管理 在jni目录下执行ndk-build即可对libyuv进行编译 编译生成的so动态库位于与jni目录同级的lib下 将lib添加到工程jni目录下为了便于管理将jni的include目录进行重新分配重新分配目录如下(已将libyuv的include加入到工程这里没有列出目录下包含的头文件) │ Android.mk │ Application.mk │ com_cj5785_ffmpegnativeplayer_NativePlayer.h │ ffmpeg_native_player.c │ └─include├─ffmpeg│ │ libavcodec-56.so│ │ libavdevice-56.so│ │ libavfilter-5.so│ │ libavformat-56.so│ │ libavutil-54.so│ │ libpostproc-53.so│ │ libswresample-1.so│ │ libswscale-3.so│ │ │ ├─libavcodec│ ├─libavdevice│ ├─libavfilter│ ├─libavformat│ ├─libavutil│ ├─libpostproc│ ├─libswresample│ └─libswscale│ └─libyuv│ libyuv.h│ libyuv.so│ └─libyuv修改Android.mk使其能找到so动态库LOCAL_PATH : $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE : avcodec LOCAL_SRC_FILES : include/ffmpeg/libavcodec-56.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : avdevice LOCAL_SRC_FILES : include/ffmpeg/libavdevice-56.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : avfilter LOCAL_SRC_FILES : include/ffmpeg/libavfilter-5.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : avformat LOCAL_SRC_FILES : include/ffmpeg/libavformat-56.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : avutil LOCAL_SRC_FILES : include/ffmpeg/libavutil-54.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : postproc LOCAL_SRC_FILES : include/ffmpeg/libpostproc-53.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : swresample LOCAL_SRC_FILES : include/ffmpeg/libswresample-1.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : swscale LOCAL_SRC_FILES : include/ffmpeg/libswscale-3.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : yuv LOCAL_SRC_FILES : include/libyuv/libyuv.so include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE : ffmpeg_native_player LOCAL_SRC_FILES : ffmpeg_native_player.c LOCAL_C_INCLUDES $(LOCAL_PATH)/include/ffmpeg LOCAL_C_INCLUDES $(LOCAL_PATH)/include/libyuv LOCAL_LDLIBS : -llog -landroid LOCAL_SHARED_LIBRARIES : avcodec avdevice avfilter avformat avutil postproc swresample swscale yuv include $(BUILD_SHARED_LIBRARY)修改Application.mk更改APP_PLATFORM使其可以使用android/native_window_jni.h和android/native_window.h头文件APP_ABI : armeabi armeabi-v7a APP_PLATFORM : android-9实现jni头文件声明的函数#include android/log.h #include stdio.h #include stdlib.h #include unistd.h #include android/native_window.h #include android/native_window_jni.h#include com_cj5785_ffmpegnativeplayer_NativePlayer.h//封装格式 #include include/ffmpeg/libavformat/avformat.h //解码 #include include/ffmpeg/libavcodec/avcodec.h //像素处理 #include include/ffmpeg/libswscale/swscale.h //包含yuvlib头文件 #include include/libyuv/libyuv.h#define LOGI(FORMAT,...) __android_log_print(4,cj5785,FORMAT,##__VA_ARGS__); #define LOGE(FORMAT,...) __android_log_print(6,cj5785,FORMAT,##__VA_ARGS__);JNIEXPORT void JNICALL Java_com_cj5785_ffmpegnativeplayer_NativePlayer_render(JNIEnv *env, jobject jobj, jstring jstr_path, jobject obj_surface) {LOGE(%s, 开始);const char *input_cstr (*env)-GetStringUTFChars(env, jstr_path, NULL);//1.注册组件av_register_all();AVFormatContext *pFormatCtx avformat_alloc_context();//2.打开视频文件if(avformat_open_input(pFormatCtx, input_cstr, NULL, NULL) ! 0){LOGE(%s, 打开文件失败!);return;}//3.获取视频相关信息if(avformat_find_stream_info(pFormatCtx, NULL) 0){LOGE(%s, 获取视频信息失败!);return;}int i 0;int video_stream_index -1;for (i 0; i pFormatCtx-nb_streams; i) {if(pFormatCtx-streams[i]-codec-codec_type AVMEDIA_TYPE_VIDEO){video_stream_index i;break;}}if (video_stream_index -1){LOGE(%s,找不到视频流\n);return;}//4.获取解码器AVCodecContext *pCodecCtx pFormatCtx-streams[video_stream_index]-codec;AVCodec *pCodec avcodec_find_decoder(pCodecCtx-codec_id);if(pCodec NULL){LOGE(%s, 无法解码!);return;}//5.打开解码器if(avcodec_open2(pCodecCtx, pCodec, NULL) 0){LOGE(%s, 解码失败!);return;}//6.以帧为单位读取视频文件AVPacket *packet (AVPacket *)av_malloc(sizeof(AVPacket));AVFrame *pFrame av_frame_alloc();AVFrame *pRGBFrame av_frame_alloc();//native绘制//窗体设置ANativeWindow *nativeWindow ANativeWindow_fromSurface(env, obj_surface);//缓冲区设置ANativeWindow_Buffer outBuffer;int len, got_frame, frame_count 0;while(av_read_frame(pFormatCtx, packet) 0){if(packet-stream_index video_stream_index){len avcodec_decode_video2(pCodecCtx, pFrame, got_frame, packet);if(len 0){LOGE(%s,解码错误!);return;}if(got_frame){LOGI(解码第%d帧, frame_count);//a.lock//设置缓冲区属性宽高像素格式ANativeWindow_setBuffersGeometry(nativeWindow, pCodecCtx-width, pCodecCtx-height, WINDOW_FORMAT_RGBA_8888);ANativeWindow_lock(nativeWindow, outBuffer, NULL);//b.fix buffer//设置RGB的缓冲区以及属性像素格式宽高RGB缓冲区和outBuffer.bits是同一块内存avpicture_fill((AVPicture *)pRGBFrame, outBuffer.bits, AV_PIX_FMT_RGBA, pCodecCtx-width, pCodecCtx-height);//YUV转化为RGBI420ToARGB(pFrame-data[0], pFrame-linesize[0],pFrame-data[2], pFrame-linesize[2],pFrame-data[1], pFrame-linesize[1],pRGBFrame-data[0], pRGBFrame-linesize[0],pCodecCtx-width, pCodecCtx-height);//c.unlockANativeWindow_unlockAndPost(nativeWindow);usleep(16 * 1000);}}av_free_packet(packet);}ANativeWindow_release(nativeWindow);av_frame_free(pFrame);av_frame_free(pRGBFrame);avcodec_close(pCodecCtx);avformat_free_context(pFormatCtx);(*env)-ReleaseStringUTFChars(env, jstr_path, input_cstr); }调用native使其能够播放 package com.cj5785.ffmpegnativeplayer;import java.io.File;import com.cj5785.ffmpegnativeplayer.view.MySurfaceView;import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.Surface; import android.view.View;public class MainActivity extends Activity {private NativePlayer player;private MySurfaceView mySurfaceView;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mySurfaceView (MySurfaceView) findViewById(R.id.surface_view);player new NativePlayer();}public void mPlay(View view) {String input Environment.getExternalStorageDirectory().getAbsolutePath() File.separatorChar oneplus.mp4;Surface surface mySurfaceView.getHolder().getSurface();player.render(input, surface);} }至此已经可以编译生成apk了在手机上测试也没有问题 更改布局和主活动使其可以播放多个测试视频 MainActivity.java package com.cj5785.ffmpegnativeplayer;import java.io.File;import com.cj5785.ffmpegnativeplayer.view.MySurfaceView;import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.Surface; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Spinner;public class MainActivity extends Activity {private NativePlayer player;private MySurfaceView mySurfaceView;private Spinner sp_video;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mySurfaceView (MySurfaceView) findViewById(R.id.surface_view);sp_video (Spinner)findViewById(R.id.sp_video);player new NativePlayer();//视频列表String[] videoArray getResources().getStringArray(R.array.video_list);ArrayAdapterString adapter new ArrayAdapterString(this, android.R.layout.simple_list_item_1, android.R.id.text1,videoArray);sp_video.setAdapter(adapter);}public void mPlay(View view) {String filename sp_video.getSelectedItem().toString();String input Environment.getExternalStorageDirectory().getAbsolutePath() File.separatorChar filename;Surface surface mySurfaceView.getHolder().getSurface();player.render(input, surface);} }activity_main.xml FrameLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent com.cj5785.ffmpegnativeplayer.view.MySurfaceViewandroid:idid/surface_viewandroid:layout_widthfill_parentandroid:layout_heightfill_parent/LinearLayoutandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalSpinner android:idid/sp_videoandroid:layout_widthwrap_contentandroid:layout_heightwrap_content/Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text开始android:onClickmPlay //LinearLayout/FrameLayout在string.xml中添加数组值 string-array namevideo_listitemnaxienian.mp4/itemitemcuc_ieschool.mkv/itemitemsintel.wmv/itemitemNocturne.m4a/item /string-array需要注意的问题 在native的实现过程中I420ToARGB()方法在调用的时候UV的位置是颠倒的需要对调UV的位置 在这个示例程序中旨在说明native是怎么绘制的其代码存在严重不足比如在主线程中绘制界面 部分视频会出现花屏现象这个问题在后面多线程解码的时候会解决 转载于:https://www.cnblogs.com/cj5785/p/10664660.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

郑州个人网站制作公司做的比较好的设计公司网站

随着科技进步,人类对大脑的认识不断深入。2004年脑的大尺度网络论述初步形成,2005年脑连接组学的概念首次提出,到2017年Sporns等在Nature neuroscience撰文系统论述,并提出了Network neuroscience的概念。与此同时,欧美…

服装企业营销网站建设养老保险怎么买最划算

stl格式,一般是用来3D打印用的文件,这种模型一般很小,经常做来做一些DIY的配件,如下图,一共有七八个模型,3D打印机把每个模型实体打出来后,就可以给小朋友组装当智益玩具玩了,我们把…

对于新公司如何让其做网站推广拓者设计吧邀请码怎么弄

今天在学习window编程方面的内容时,我想要修改一个窗口的标题,这个标题的内容是窗口的高度,这就遇到一个问题,设置标题的方法是SetWindowText,其第二个形参是LPCWSTR类型,怎么把内容显示到窗口标题栏上呢&a…

免费发外链的网站网站建设用哪个

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. DQL1.1 基本语法1.2 基础查询1.3 条件查询1.3 聚合函数 🌤️ 全篇…

网站开发科普书商城服务是怎么赚钱

中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的&…

山东官网建设公司廊坊短视频优化公司

1:父类中最好要有一个空参数的构造方法,因为默认的构造方法在自定义了构造方法后就不存在了,需要显示的写出来。 若父类中没有空参数的构造方法,则子类必须有自定义的构造方法,且用super()调用父…

安阳+网站建设WordPress数据库切割

消息队列是消息的链表,存放在内核中并有消息队列标示符标示。msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;…

网站建设实施流程网站开发的分录怎么做

一、功能定义 高速路自动驾驶功能HWP是指在一般畅通高速公路或城市快速路上驾驶员可以放开双手双脚,同时注意力可在较长时间内从驾驶环境中转移,做一些诸如看手机、接电话、看风景等活动,该系统最低工作速度为60kph。 如上两种不同环境和速度…

江门模板建站哪家好企业网站开发公司排名

Solr的Filed中indexed与stored属性转载于:https://www.cnblogs.com/xiaostudy/p/11105554.html

阿里云服务器做网站多少钱公众号二次开发

C 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C 编程中最基本和最常见的 I/O 操作。 C 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存&#…

做熊猫tv网站的目的网站中的知识 视频从哪里来的

前言 踩着前人的肩膀,努力前行。参考了很多前人的文章。 1.变量声明const和let es6之前声明变量只能用var,var的特点是无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部) function test(){if(false){var name …

某网站安全建设方案烟台网站开发多少钱

1》验站 如下截图,验站就是在DNS域名商哪里,在对应host下面,添加一个TXT记录类型,主机记录,记录值后,检测即可。   2》SSL证书申请 阿里云,腾讯云有很多免费证书申请,免费的缺点是…

公司以前做的免费网站太多_新网站搜索不到阜新网站开发

win7系统,打卡资源管理器,组织,文件夹选项,查看,去掉“始终显示图标,从不显示缩略图”前面的勾,确定。其它系统的位置大同小异转载于:https://www.cnblogs.com/flyoung/p/9376122.html

婚恋网站制作福州抖音seo

引言 使用gitlab提交代码的时候,若是使用的命令行,则需要输入命令行指令。下面是日常遇到的常用的命令行指令。 详情 git命令行常用指令的使用: git status #上次提交后是否对文件再做了修改项目1git add . #添加所有的变动git checkout …

好的做网站公司烟台网站建站

链接:https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码:1688 第1问: Q:请问在初始化CPU堆栈的时候一开始在执行mov r0, LR这句指令时处理器是什么模式 A:复位后的模式,即管理模式. …

小程序商城设计国内seo服务商

在使用git进行项目管理的时候,有时候一些安装包之类,或者自己本地项目使用的一些编译文件,在不需要提交到远程仓库时,可以通过以下几种方式设置忽略提交,包括文件夹和单个文件.之前自己项目里面采用了第二种方法进行了设置,但是时间久远竟然忘记了.....,导致我有一些文件始终无…

专门做捷径网站广州建设h5网站

问题1:char、varchar的区别是什么? varchar是变长而char的长度是固定的。如果你的内容是固定大小的,你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么? DELETE命令从一个表中删除某一行,或多行,…

帮客户做违法网站违法么电商分销

String StringBuilder StringBuffer三者之间的区别~~~String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是final,由于它的不变性,类似拼接,剪裁字符串等操作,都会产生…

广州建站公司有哪些做一组静态页面网站多少钱

教程领到手,学习不用愁!领 ↑↑↑最高效最快速的入门学习方式:看知识兔视频课程,跟着知识兔老师操作,听知识兔老师讲解,初学者不要自己瞎琢磨瞎折腾,很容易走弯路。学以致用,光看不练…

东莞网站推广哪家好信息网站维护说明

题目链接 这题跟Balance Act那题差不多&#xff0c;求图的质点。我直接将那题改了一下提交&#xff0c;结果PE了一次&#xff0c;又WA了一次&#xff0c;最后发现是单case&#xff0c;多case的提交为什么WA呢&#xff1f; View Code 1 #include <stdio.h>2 #include <…