需要获得正确的 AVI Player 类才能在 Android 应用程序中播放所有 AVI 视频文件

问题描述 投票:0回答:2

我尝试使用正确的 AVI 视频播放器来播放 AVI 文件,因为我当前的 AVI 播放器类看起来不再工作得很好。

有些 AVI 文件可以正常播放,但有些则不能。

知道哪个 AVI 视频播放器类的人可以准确播放所有 avi 文件,

请帮助我,

谢谢你,

p/秒:

我不想让第三个应用程序播放 AVI 文件。

以下代码是我当前用来播放AVI文件的代码:

AVI播放器.java 包可运行;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import iterface.IVideoSink;

public class VideoPlayer implements Runnable {
private final int FPS = 24;
/**
 * String section
 */
private boolean IS_ALIVE = true;
private long LAST_FRAME_TIME;
/**
 * Data section
 */
private ArrayList<IVideoSink> mAlVideoSinks;
/**
 * Others section
 */
private BufferedInputStream mBufferedInputStream;

public VideoPlayer(String filename) {
    mAlVideoSinks = new ArrayList<IVideoSink>();

    try {
        mBufferedInputStream = new BufferedInputStream(new FileInputStream(filename));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

public void addVideoSink(IVideoSink videoSink) {
    synchronized (mAlVideoSinks) {
        mAlVideoSinks.add(videoSink);
    }
}

public void removeVideoSink(IVideoSink videoSink) {
    synchronized (mAlVideoSinks) {
        if (mAlVideoSinks.contains(videoSink))
            mAlVideoSinks.remove(videoSink);
    }
}

@Override
public void run() {
    int count = 0;

    while (IS_ALIVE) {
        if (LAST_FRAME_TIME == 0) {
            LAST_FRAME_TIME = System.currentTimeMillis();
        }

        try {
            long currentTime = System.currentTimeMillis();
            if (currentTime - LAST_FRAME_TIME < 1000 / FPS) {
                Thread.sleep(1000 / FPS - (currentTime - LAST_FRAME_TIME));
            }
            LAST_FRAME_TIME = System.currentTimeMillis();

            int b0 = mBufferedInputStream.read();
            if (b0 == -1) break;
            int b1 = mBufferedInputStream.read();
            int b2 = mBufferedInputStream.read();
            int b3 = mBufferedInputStream.read();

            count = b0 + (b1 << 8) + (b2 << 16) + (b3 << 24);
            byte[] buffer = new byte[count];
            int readCount = mBufferedInputStream.read(buffer, 0, count);
            for (IVideoSink videoSink : mAlVideoSinks) {
                videoSink.onFrame(buffer, null);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    try {
        mBufferedInputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    for (IVideoSink videoSink : mAlVideoSinks) {
        videoSink.onVideoEnd();
    }

}

public void stop() {
    IS_ALIVE = false;
}

}

PCM播放器.java

package runnable;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

import java.util.ArrayList;

public class PCMPlayer implements Runnable {
/**
 * String section
 */
private boolean IS_ALIVE = true;
/**
 * Data section
 */
private ArrayList<byte[]> mAlBuffers = new ArrayList<byte[]>();
/**
 * Other section
 */
private AudioTrack mAudioTrack;

public PCMPlayer() {
}

@Override
public void run() {
    int bufSize = AudioTrack.getMinBufferSize(8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufSize,
            AudioTrack.MODE_STREAM);
    mAudioTrack.play();

    while (IS_ALIVE) {
        byte[] buffer = null;
        boolean dataFlag = true;

        while (dataFlag) {
            synchronized (mAlBuffers) {
                if (mAlBuffers.size() > 0) {
                    buffer = mAlBuffers.remove(0);
                } else {
                    dataFlag = false;
                    break;
                }
            }

            mAudioTrack.write(buffer, 0, buffer.length);
        }

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    mAudioTrack.stop();
    mAudioTrack.release();
}

public void writePCM(byte[] pcm) {
    synchronized (mAlBuffers) {
        byte[] buffer = new byte[pcm.length];
        System.arraycopy(pcm, 0, buffer, 0, buffer.length);
        mAlBuffers.add(buffer);
    }
}

public void stop() {
    IS_ALIVE = false;
}
}
java android video android-video-player avi
2个回答
0
投票

我不知道你的意图。但在你的地方,我会使用图书馆来实现这一点。例如lpe jVLC .

问题在于 AVI 只是声音和视频数据的容器,可以由任何编解码器进行编码。声音可以是mp3、ogg等,视频可以是mpeg、divx、xvid等多个版本。

您不能指望所有 AVI 都包含相同的声音/视频格式。这就是为什么您当前的程序无法播放某些 AVI 文件的原因。


0
投票

我对 Exoplayer 非常满意,它很简单,速度很快,我可以在我的应用程序中的任何页面上使用它,它最近被弃用并被 android 接管,现在称为 Media3.Exoplayer,Android 已经接管它现在代码行一直在继续,如果您愿意,请尝试一下。

https://medium.com/@rawatsumit115/play-videos-by-using-jetpack-media3-exoplayer-in-android-kotlin-c736136de580

© www.soinside.com 2019 - 2024. All rights reserved.