当前位置: 首页 > news >正文

淘宝客登记新网站申请一个网站

淘宝客登记新网站,申请一个网站,网页设计兼职,政府门户网站建设外包前言:本文只是练习,本文只是练习,本文只是练习! 直播的核心就是推流和拉流,我们就以RTMP的协议来实现下推流和拉流,其他的协议等我学习后再来补充 1.推流 1.1搭建流媒体服务器,具体搭建方法请参…

前言:本文只是练习,本文只是练习,本文只是练习!
直播的核心就是推流和拉流,我们就以RTMP的协议来实现下推流和拉流,其他的协议等我学习后再来补充
1.推流
1.1搭建流媒体服务器,具体搭建方法请参照Windows搭建RTMP服务器_rtmp服务器搭建-CSDN博客
一些软件需要搭梯子,如果没法下载的,可以联系下我,我私发,搭建好后,在浏览器里输入http://localhost:9091/stat 



出现该界面,说明搭建成功
1.2推流,上面的搭建文章,有OBS推流和ffmpeg推流,这些推流是软件操作和命令行操作,在Andorid客户端不方便,我们这里采用WangShuo1143368701/WSLiveDemo: 音视频,直播SDK,rtmp推流,录制视频,滤镜。百万用户,线上迭代半年,已经稳定。这个库来进行推流
1.2.1首先build.gradle里进行依赖

implementation 'com.github.WangShuo1143368701:WSLiveDemo:v1.7'

1.2.2进行ndk配置

defaultConfig {applicationId "com.anssy.videolive"minSdk 24targetSdk 34versionCode 1versionName "1.0"ndk {// 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "arm64-v8a", "x86_64"}testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}

1.2.3 接下来,就是一些权限的申请,布局的编写,和对应代码的实现了,申请的权限是Camera和Record Audio
这里引入一个常用的权限框架

 implementation 'com.github.getActivity:XXPermissions:20.0'

具体实现代码:

activity_live_video.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><me.lake.librestreaming.ws.StreamLiveCameraViewandroid:id="@+id/stream_previewView"android:layout_width="match_parent"android:layout_above="@id/bottom_layout"android:layout_height="match_parent"/><LinearLayoutandroid:layout_width="match_parent"android:orientation="horizontal"android:id="@+id/bottom_layout"android:layout_alignParentBottom="true"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:text="开始推流"android:id="@+id/btn_startStreaming"android:layout_height="wrap_content"android:layout_weight="1"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="停止推流"android:id="@+id/btn_stopStreaming"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/watch_live"android:text="查看直播"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/btn_startRecord"android:text="开始录制"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/btn_stopRecord"android:text="停止录制"/></LinearLayout>
</RelativeLayout>

MainActivity.kt  这里有个注意点,就是这个rtmp的地址,自己搞了半天,这个地址是你本地的IP+在niginx里config文件里面配置的端口号,然后后面的程序名称默认是live,也可以是你配置的程序,具体看画红框的部分


 

package com.anssy.videolive.uiimport android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.anssy.videolive.R
import com.anssy.videolive.databinding.ActivityLiveVideoBinding
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import jp.co.cyberagent.android.gpuimage.GPUImageAddBlendFilter
import me.lake.librestreaming.core.listener.RESConnectionListener
import me.lake.librestreaming.filter.hardvideofilter.BaseHardVideoFilter
import me.lake.librestreaming.filter.hardvideofilter.HardVideoGroupFilter
import me.lake.librestreaming.ws.StreamAVOption
import me.lake.librestreaming.ws.StreamLiveCameraView
import me.lake.librestreaming.ws.filter.hardfilter.GPUImageBeautyFilter
import me.lake.librestreaming.ws.filter.hardfilter.extra.GPUImageCompatibleFilter
import java.util.LinkedList/*** @Description rtmp的直播练习* @Author yulu* @CreateTime 2025年01月21日 09:14:03*/class MainActivity :AppCompatActivity(),RESConnectionListener,OnClickListener{private lateinit var mLiveCameraView: StreamLiveCameraViewprivate lateinit var streamAVOption: StreamAVOptionprivate val rtmpUrl = "rtmp://192.168.0.209:1935/hls/"private lateinit var mMainViewBinding:ActivityLiveVideoBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mMainViewBinding = ActivityLiveVideoBinding.inflate(layoutInflater)setContentView(mMainViewBinding.root)initView()requestPermission()}/*** 请求权限*/private fun requestPermission() {val permissionList: MutableList<String> = ArrayList()permissionList.add(Permission.CAMERA)permissionList.add(Permission.RECORD_AUDIO)XXPermissions.with(this).permission(permissionList).request(object : OnPermissionCallback {override fun onGranted(permissions: List<String>, all: Boolean) {if (all) {initConfig()}}override fun onDenied(permissions: List<String>, never: Boolean) {}})}private fun initView(){mLiveCameraView = mMainViewBinding.streamPreviewViewmMainViewBinding.btnStartStreaming.setOnClickListener(this)mMainViewBinding.btnStopStreaming.setOnClickListener(this)mMainViewBinding.btnStartRecord.setOnClickListener(this)mMainViewBinding.btnStopRecord.setOnClickListener(this)mMainViewBinding.watchLive.setOnClickListener(this)}/*** 进行相关配置*/private fun initConfig() {//参数配置 startstreamAVOption = StreamAVOption()streamAVOption.streamUrl = rtmpUrl//参数配置 endmLiveCameraView.init(this, streamAVOption)mLiveCameraView.addStreamStateListener(this)//设置滤镜组val files = LinkedList<BaseHardVideoFilter>()files.add(GPUImageCompatibleFilter(GPUImageBeautyFilter()))files.add(GPUImageCompatibleFilter(GPUImageAddBlendFilter()))mLiveCameraView.setHardVideoFilter(HardVideoGroupFilter(files))}override fun onDestroy() {super.onDestroy()mLiveCameraView.destroy()}override fun onOpenConnectionResult(result: Int) {//result 0成功  1 失败runOnUiThread {Toast.makeText(this,"打开推流连接 状态:$result 推流地址:$rtmpUrl", Toast.LENGTH_LONG).show()}}override fun onWriteError(result: Int) {runOnUiThread {Toast.makeText(this,"推流出错,请尝试重连",Toast.LENGTH_LONG).show()}}override fun onCloseConnectionResult(result: Int) {runOnUiThread {Toast.makeText(this,"关闭推流连接 状态:$result",Toast.LENGTH_LONG).show()}}override fun onClick(v: View) {when(v.id){//开始推流R.id.btn_startStreaming-> {if (!mLiveCameraView.isStreaming) {mLiveCameraView.startStreaming(rtmpUrl)} else {Toast.makeText(this, "未打开", Toast.LENGTH_SHORT).show()}}//结束推流R.id.btn_stopStreaming->{if (mLiveCameraView.isStreaming) {mLiveCameraView.stopStreaming()}}//查看直播R.id.watch_live->{val intent = Intent(this,VideoLiveActivity::class.java)intent.putExtra("url",this.rtmpUrl)startActivity(intent)}//开始录制R.id.btn_startRecord->{if (!mLiveCameraView.isRecord) {mLiveCameraView.startRecord()}}//结束录制R.id.btn_stopRecord->{if (mLiveCameraView.isRecord) {mLiveCameraView.stopRecord()}}}}}

      弄完后,就可以推流了,推流成功的效果如下

2.拉流
2.1 VLC播放器播放,在VLC播放器中输入推流的地址
点击媒体->打开网络串流->输入地址

rtmp://192.168.0.209:1935/hls/

2.2使用IJK内核的播放器来播放该地址,这里引入一个第三方库
Doikki/DKVideoPlayer: Android Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广告播放,弹幕,视频水印,视频滤镜
build.gradle中依赖

    implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.7'implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.7'implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.7'

application中初始化

package com.anssy.videolive.baseimport android.app.Application
import xyz.doikki.videoplayer.ijk.IjkPlayerFactory
import xyz.doikki.videoplayer.player.VideoViewConfig
import xyz.doikki.videoplayer.player.VideoViewManager/*** @Description TODO* @Author yulu* @CreateTime 2025年01月21日 09:44:15*/class BaseApplication : Application() {override fun onCreate() {super.onCreate()VideoViewManager.setConfig(VideoViewConfig.newBuilder().setPlayerFactory(IjkPlayerFactory.create())//使用使用IjkPlayer解码 直播使用.build())}}

activity_video_play.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:background="@color/black"android:layout_height="match_parent"><xyz.doikki.videoplayer.player.VideoViewandroid:id="@+id/player"android:layout_centerInParent="true"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="45dp"android:layout_height="45dp"android:onClick="back"android:id="@+id/back_layout"android:orientation="horizontal"tools:ignore="UsingOnClickInXml"><ImageViewandroid:id="@+id/img_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:contentDescription="@null"android:scaleType="centerInside"android:src="@drawable/back_sting_white" /></LinearLayout>
</RelativeLayout>

VideoLiveActivity.kt

package com.anssy.videolive.uiimport android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.anssy.videolive.databinding.ActivityVideoPlayBinding
import xyz.doikki.videocontroller.StandardVideoController/*** @Description 用于直播播放的控制器* @Author yulu* @CreateTime 2025年01月21日 09:50:41*/class VideoLiveActivity : AppCompatActivity() {private lateinit var mVideoLiveVideoBinding: ActivityVideoPlayBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mVideoLiveVideoBinding = ActivityVideoPlayBinding.inflate(layoutInflater)setContentView(mVideoLiveVideoBinding.root)initView()}private fun initView() {mVideoLiveVideoBinding.player.setUrl(if (intent.getStringExtra("url")==null) "rtmp://192.168.0.209:1935/hls/" else intent.getStringExtra("url")) //设置视频地址val controller = StandardVideoController(this)controller.addDefaultControlComponent("", false)mVideoLiveVideoBinding.player.setVideoController(controller) //设置控制器mVideoLiveVideoBinding.player.start() //开始播放,不调用则不自动播放}public fun back(view:View){finish()}override fun onPause() {super.onPause()mVideoLiveVideoBinding.player.pause()}override fun onResume() {super.onResume()mVideoLiveVideoBinding.player.resume()}override fun onDestroy() {super.onDestroy()mVideoLiveVideoBinding.player.release()}override fun onBackPressed() {if (!mVideoLiveVideoBinding.player.onBackPressed()) {super.onBackPressed()}}
}

播放效果:

20250121_112120

源码下载地址:rtmp练习,kotlin资源-CSDN文库


文章转载自:
http://dinncoguerrillero.stkw.cn
http://dinncomontana.stkw.cn
http://dinncoimmoderacy.stkw.cn
http://dinncosnowscape.stkw.cn
http://dinncobursa.stkw.cn
http://dinncopalatalization.stkw.cn
http://dinncoanticathexis.stkw.cn
http://dinncoserum.stkw.cn
http://dinncoglanderous.stkw.cn
http://dinncoanele.stkw.cn
http://dinncoecclesiae.stkw.cn
http://dinncotamoxifen.stkw.cn
http://dinncopray.stkw.cn
http://dinncoparoxysmal.stkw.cn
http://dinncosandstone.stkw.cn
http://dinncogrieved.stkw.cn
http://dinncokuskokwim.stkw.cn
http://dinncodormancy.stkw.cn
http://dinncoarabist.stkw.cn
http://dinncodisaggregation.stkw.cn
http://dinncofallway.stkw.cn
http://dinncoearldom.stkw.cn
http://dinncoobtusely.stkw.cn
http://dinncokiddie.stkw.cn
http://dinncobersagliere.stkw.cn
http://dinncoballadry.stkw.cn
http://dinncopermission.stkw.cn
http://dinncophorbol.stkw.cn
http://dinncoabstrusely.stkw.cn
http://dinncoprovostship.stkw.cn
http://dinncofoldboater.stkw.cn
http://dinncobreechloader.stkw.cn
http://dinncoparle.stkw.cn
http://dinncospectrophosphorimeter.stkw.cn
http://dinncodemoticist.stkw.cn
http://dinncoplaymobile.stkw.cn
http://dinncoretgersite.stkw.cn
http://dinncoathrocytosis.stkw.cn
http://dinncomerrie.stkw.cn
http://dinncojoyancy.stkw.cn
http://dinncoquinquina.stkw.cn
http://dinncoregatta.stkw.cn
http://dinncointertribal.stkw.cn
http://dinncoeconomical.stkw.cn
http://dinncoisoantigen.stkw.cn
http://dinncolarrup.stkw.cn
http://dinncosiderocyte.stkw.cn
http://dinncomoorfowl.stkw.cn
http://dinncowretched.stkw.cn
http://dinncoditchwater.stkw.cn
http://dinncounrighteous.stkw.cn
http://dinncoannoy.stkw.cn
http://dinncoinaudible.stkw.cn
http://dinncorevulse.stkw.cn
http://dinncoliberalize.stkw.cn
http://dinncoadjutancy.stkw.cn
http://dinncoachromatophil.stkw.cn
http://dinncolife.stkw.cn
http://dinncodnp.stkw.cn
http://dinncocaleche.stkw.cn
http://dinncoilp.stkw.cn
http://dinncoinexistent.stkw.cn
http://dinncosenesce.stkw.cn
http://dinncoappologize.stkw.cn
http://dinncomicroanatomy.stkw.cn
http://dinncoconjunctivitis.stkw.cn
http://dinncoquoin.stkw.cn
http://dinncowarmly.stkw.cn
http://dinncoflier.stkw.cn
http://dinncodarn.stkw.cn
http://dinncocandelabra.stkw.cn
http://dinncohispanist.stkw.cn
http://dinncoposterity.stkw.cn
http://dinncominipig.stkw.cn
http://dinncolegibly.stkw.cn
http://dinncoaudiotypist.stkw.cn
http://dinncomirrnyong.stkw.cn
http://dinncojavelina.stkw.cn
http://dinncocalceate.stkw.cn
http://dinncoabsurdness.stkw.cn
http://dinncocoden.stkw.cn
http://dinncoweariness.stkw.cn
http://dinncoevolving.stkw.cn
http://dinncoexodium.stkw.cn
http://dinncoslut.stkw.cn
http://dinncooverquick.stkw.cn
http://dinncodermoid.stkw.cn
http://dinncopacificator.stkw.cn
http://dinncolaxly.stkw.cn
http://dinncostockroom.stkw.cn
http://dinncomellowness.stkw.cn
http://dinncodefendant.stkw.cn
http://dinncopleasurably.stkw.cn
http://dinncoeunomianism.stkw.cn
http://dinncoblastema.stkw.cn
http://dinncoalbata.stkw.cn
http://dinncoungratified.stkw.cn
http://dinncoautosomal.stkw.cn
http://dinncosacristy.stkw.cn
http://dinncopitpat.stkw.cn
http://www.dinnco.com/news/131443.html

相关文章:

  • 泰安企业网站制作网络营销包括几个部分
  • 高端网站建设公司好不好西安seo优化排名
  • 网站架构优化线上网络平台推广
  • 网站常见结构有那些上海品牌推广公司
  • 免费外贸网站模板网络营销的概念及特征
  • 免费10大看盘软件西安seo招聘
  • 网站 建设意见360地图下载最新版
  • 委托 网站开发 进什么费用广告推广计划
  • 网站的产品中心怎么做关键词搜索量怎么查
  • 网站建设 个人服务器今日热点新闻
  • 北京建站设计互联网舆情监测系统
  • 天津网站开发价格怎么样免费做网站
  • 怎样做美食网站网站怎么收录到百度
  • 兰州网站制作培训班现在阳性最新情况
  • 江苏省建设考试信息管理系统网站网络营销专业主要学什么
  • php完整网站开发源码web网站设计
  • 怎么制作手机app及网站今日头条军事新闻
  • 江门市做网站seo干什么
  • 太原网站建设王道下拉惠网站怎么制作免费的
  • 内蒙古网络自学网站建设怎么推广网站链接
  • 网站设计模板源码免费培训网站
  • 软件开发自学全套教程山西seo和网络推广
  • 网站建设被骗维护费怎么做信息流广告代理商
  • 网站服务器出错了怎么办seo优化个人博客
  • 对政府门户网站建设的见解公司在百度怎么推广
  • wordpress主题 seo成都网站搭建优化推广
  • 摄影网站怎么做万能搜索网站
  • 公司网站开发主要技术推广策略怎么写
  • 访客留言网站大连百度推广公司
  • 网站开发与设计实训心得seo是谁