android原生MediaPlayer播放本地的m3u8

这篇具有很好参考价值的文章主要介绍了android原生MediaPlayer播放本地的m3u8。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

遇到某个需求,需要播放百度网盘的视频。但是通过百度网盘的sdk获取到的视频url是由若干个ts片段组成的m3u8播放源。然后把这个m3u8的播放源放在本地,也就是说m3u8是一个本地播放源。那么如何去播放呢?这边引进一个http轻量级的服务器NanoHttpd。

选择播放器

目前市场上流行的播放器,比如ijkPlay,是可以直接播放本地的m3u8,但是android原生的播放器却不能。那么如何去播放呢?这边引进一个http轻量级的服务器NanoHttpd。

什么是NanoHttpd?

NanoHTTPD是一个免费、轻量级的HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。可轻松定制临时文件使用和线程模型。

git地址:
https://github.com/NanoHttpd/nanohttpd

下面看看NanoHttpd的使用情况

1.在build.gradle文件中引入nanohttpd
implementation ‘org.nanohttpd:nanohttpd:2.3.1’

2.由于9.0以上禁止使用未加密的连接,所以在res下添加xml文件夹,并把network_security_config.xml放到该文件夹下,并在AndroidManifest.xml的application中添加android:networkSecurityConfig="@xml/network_security_config"network_security_config文件的具体内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">127.0.0.1</domain>
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

3.如果.m3u8的文件是放在sdcard中需要在AndroidManifest.xml下添加相关的读写权限,放在data/data中则不需要

  <!--写sdcard权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 添加完以上配置后,就可以使用了,具体使用可参考LocalServer:
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import fi.iki.elonen.NanoHTTPD;
public class LocalServer extends NanoHTTPD {

    private static String TAG = "CcLocalServer";
    /**
     * m3u8的文件格式
     */
    private static final String MIME_TYPE_M3U8 = "video/x-mpegURL";

    // 端口号
    public static final int PORT = 9999;

    /**
     * 构造方法
     */
    public LocalServer() {
        // 端口号
        super(PORT);
        Log.d(TAG, "---CcLocalServer---");
    }


    /**
     * 重写 serve 方法,获取本地视频文件
     *
     * @param session The HTTP session
     * @return
     */
    @Override
    public Response serve(IHTTPSession session) {
        // 获取请求的url
        String url = session.getUri();
        Log.d(TAG, "请求URL:" + url);
        try {
            File file = new File(url);
            //判断本地的文件是否存在
            if (file.exists()) {
                //直接返回m3u8的文件格式
                return newChunkedResponse(Response.Status.OK, MIME_TYPE_M3U8, new FileInputStream(file));
            } else {
                return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/html", "文件不存在:" + url);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/html", "文件不存在:" + url);
        }
    }
}

activity中如何使用呢?

注意:m3u8文件和文件的存放位置由使用者自己决定文章来源地址https://www.toymoban.com/news/detail-459670.html

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.example.mediaplaydome.server.LocalServer;

public class MediaPlayerActivity extends AppCompatActivity {
    private static final String TAG = "MediaPlayerActivity";
    private SurfaceHolder surfaceHolder;
    private SurfaceView surfaceView;
    private MediaPlayer mediaPlayer;

    private LocalServer mMyServer = new LocalServer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_media_player);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        startLocalServer();
        startPlayVideo();
    }

    /**
     * 开启本地服务器
     */
    private void startLocalServer() {
        try {
            // 开启本地代理
            mMyServer.start();
        } catch (Exception e) {
            Log.e(TAG, "server start failed", e);
        }
    }

    /**
     * 开始播放
     */
    private void startPlayVideo() {
        String url = getHttpUrl(Environment.getExternalStorageDirectory().getPath() + "/local_m3u8/test.m3u8");
        Log.i(TAG, "当前的url:" + url);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            mediaPlayer.setDataSource(url);
            surfaceHolder = surfaceView.getHolder();
            surfaceHolder.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
                    mediaPlayer.setDisplay(surfaceHolder);
                }

                @Override
                public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
                }

                @Override
                public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
                }
            });
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    mediaPlayer.setLooping(true);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭服务
        if (mMyServer != null) {
            mMyServer.closeAllConnections();
            mMyServer = null;
            Log.e(TAG, "app destory, so server close");
        }
    }

    /**
     * 通过本地文件的地址,获取本地http的地址
     * @param localUrl
     * @return
     */
    public static String getHttpUrl(String localUrl) {
        if (TextUtils.isEmpty(localUrl)) {
            return localUrl;
        }
        return String.format("http://127.0.0.1:%d%s", LocalServer.PORT, localUrl);
    }
}

到了这里,关于android原生MediaPlayer播放本地的m3u8的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .m3u8、HLS 协议

    常见的视频传输协议: HTTP 浏览器一次性把视频请求下来,一般来说用户可以点击鼠标右键或者通过抓包的方式直接把视频下载到本地 HLS (HTTP Live Streaming)Apple 开发的一种视频传输格式,其核心思想是将视频分为多个 .ts 文件,用户播放视频的时候只请求一部分 .ts 文件,无

    2024年02月16日
    浏览(21)
  • video插件播放m3u8格式视频(存原生)

    这里使用原生的javascript实现m3u8格式视频播放。 使用了包括video.min.js库和HLS插件。 在上面代码中,首先引入了video.min.js库和对应的播放器样式video-js.css,还引入了videojs-contrib-hls.min.js库(引入顺序考虑优先放到页面加载之前)。 之后,创建一个video标签,并指定source的src属性为

    2024年02月13日
    浏览(37)
  • 关于网页视频下载方法(仅针对存在index.m3u8)

    必备工具:迅雷、ffmpeg、python环境 选用工具:猫抓插件 像腾讯课堂希望下载的课 1.下载m3u8文件。 首先使用【猫抓视频下载】的浏览器拓展,可以清晰地看到,它不抓到的内容。我们需要的就是这个 .m3u8 的文件。 ps:其中可以也将其中的一个ts文件下下来,主要需要的是它的

    2024年02月06日
    浏览(28)
  • ffmpeg本地TS和M3U8播放流程及调试过程

     本地TS播放过程 本地M3U8播放过程  http工作流程    http分两个步骤 1、获取m3u8文件,这个是在哪里开始读的? 2、获取data数据,这个是从http_read开始读,可以通过修改这里实现buffer数据和引擎对接 3、s-user_agent,s-off,s-end_off,s-seekable这些是什么时候赋值的? 从 http_get_line获取到

    2024年01月24日
    浏览(28)
  • Android ExoPlayer2播放m3u8视频设置Cookie

    支持m3u8格式视频,同时服务端做了加密防止视频被盗。 服务端需要客户端这边再请求.m3u8地址时带上3个Cookie参数,分别是CloudFront-Policy,CloudFront-Signature,CloudFront-Key-Pair-Id。 本地使用了GSYVideoPlayer作为视频播放器,如何设置Cookie是个问题,原本以为直接将待传入的三个Cookie直接

    2024年01月16日
    浏览(33)
  • Web_单一视频文件mp4转换为m3u分段ts文件实现边下边播

    Builds - CODEX FFMPEG @ gyan.dev 先解压缩,会看到如下结构: 进入bin目录, 把需要转换的视频文件复制过来 ,同时 新建一个文件夹 用来存放转换后的文件,然后按住Shift键同时单击鼠标右键,选择打开Powershell窗口: 输入以下命令(根据实际修改)后按Enter键: ffmpeg -i 源视频名字

    2024年02月10日
    浏览(33)
  • Qt编写视频监控系统73-不同视频流不同类型的判断和解析(http/m3u8/rtsp/rtmp等)

    这套视频监控系统大概从2018年起步整体框架,一步步积累到现在,中间经历了无数次的各种视频文件、视频流、视频设备的播放测试,比如光视频文件就有mp4/wmv/rmvb/mkv/avi等格式,视频设备有本地USB摄像头、桌面等,视频流有rtmp/rtsp/rtp/http等,其中http开头的就有视频文件和视

    2024年02月05日
    浏览(33)
  • 【疑问&解决】访问CSDN文章的3种方式(自定义域名) | 关于网址的后缀:spm=1001.2014.3001.5501 | .m3u8文件、HLS协议? | 文心一言2023--7月15~16测试

      暧昧上头的那一刻,像极了爱情,但终归不是爱情哦!     🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[3] 阿里云社区特邀专家博主🏅   🏆[4] CSDN-人工智能领域优质创作者🏆

    2024年02月13日
    浏览(28)
  • html5播放 m3u8

    注意:m3u8地址要为网络地址,直接把代码复制为html直接在本地打开,可能不行,需要放在nginx或者apache或者其他的web服务器上运行。

    2024年02月20日
    浏览(23)
  • 安卓实现M3U8文件的下载和播放

    现如今网络上的视频大多数都是m3u8格式的,使用m3u8格式有以下好处 1. 方便切换码率,例如从高清转到蓝光 2. 节约流量,m3u8实际切割成一段段的TS后缀视频,传统请求是把整个文件流返回去,网络不好或者文件过大时,都会造成响应缓慢,m3u8则是返回一个个的ts文件,当前

    2023年04月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包