Android Studio: чтение .mp4 из каталога res/raw/ кадр за кадром

Для моего приложения мне нужно загрузить отдельные изображения видеофайла, расположенного в моем каталоге res/raw/, в список/массив изображений. Из этого списка/массива изображений мне нужно выбрать несколько изображений, которые будут сохранены в новом видеофайле, также расположенном в каталоге res/raw/.

Проблема в том, что я не могу получить путь к своему видео. Если я попытаюсь использовать:

Файл f = new Flie("app/res/raw/test.mp4");

Я получаю ошибку: файл не может быть найден.

Я пытался использовать Uri, например:

Строка videopath ="android.resource://" + getPackageName()+ R.raw.test; Файл f = новый Flie(videopath.toString());

Но и это не работает.

Вот псевдокод, как мне это нужно:

List<Picture> video = new ArrayList<Picture>();
File file = new file("path_to_file/test.mp4");
FrameGrab grab = FrameGrab.createFrameGrab(NIOUtils.readableChannel(file));
Picture picture;

while (null != (picture = grab.getNativeFrame())) {
    video.add(picture);
}


List<picture> video_new = new ArrayList<picture>();
int[] idx = {1,2,4,6,8 ...}

for(int i= 0; i<idx.length; i++){
    picture= video.get(idx[i]);
    video_new.add(picture);
}

//stores the new video into the same path but with a different name
storefile("path_to_file/test_new.mp4", video_new);


person Paul Koch    schedule 02.04.2019    source источник


Ответы (1)


Похоже, вы можете пропустить косую черту в пути к файлу.

Попробуйте изменить:

String videopath ="android.resource://" + getPackageName()+ R.raw.test

To:

String videopath ="android.resource://" + getPackageName()+ "/" + R.raw.test

Использование этого для доступа и воспроизведения видео будет выглядеть так:

VideoView view = (VideoView)findViewById(R.id.videoView);
String videopath ="android.resource://" + getPackageName()+ "/" + R.raw.test
view.setVideoURI(Uri.parse(videopath));
view.start();

Примечание

Для извлечения кадров из медиафайла (например, видео) Android предоставляет класс MediaMetadataRetriever.

person Mick    schedule 02.04.2019
comment
Большое спасибо за Вашу помощь. Но я просто забыл добавить это в псевдокод, мой плохой. Проблема в том, что файловая система не понимает путь, указанный как android.resource://. Спасибо за помощь ты. - person Paul Koch; 02.04.2019
comment
android.resource:// на самом деле просто строка - я обновил ответ полным URI, показывающим, как вы используете его для воспроизведения видео в качестве примера. - person Mick; 03.04.2019
comment
Похоже, вы неправильно поняли вопрос. Я не хочу смотреть видео. Мне нужны рамки. Спасибо за помощь ты. - person Paul Koch; 03.04.2019
comment
"Проблема в том, что я не могу получить путь к своему видео" - это проблема, которую вы выделили, я думаю. Android использует URI для идентификации файлов, поэтому приведенный выше пример показывает, как использовать URI для доступа к файлу. Если вы хотите, чтобы решение извлекало каждый кадр из видео и сохраняло его, вы, вероятно, захотите включить некоторый фактический код и выделить часть, которая не работает для вас. Я добавил примечание выше об одном способе получения кадров из видеофайла — вы также можете использовать OpenCv, хотя документация для Android Studio не очень хороша, когда я последний раз смотрел. - person Mick; 03.04.2019
comment
MediaMetadataRetriever - это то, что я ищу. Я гуглил два дня и не нашел ни одной ссылки на него. Большое спасибо. Однако я нашел другой метод самостоятельно. Я загружаю видео со своих ресурсов в качестве входного потока и сохраняю этот входной поток во внутреннюю память. Из этого я могу использовать прямой путь для создания нового файла и использовать jcodec для чтения кадров. Однако я посмотрю на MediaMetadataRetriever. Это, кажется, правильный путь. - person Paul Koch; 03.04.2019