Я часто вижу, как разработчики Ionic Framework не понимают, как использовать плагины Cordova и плагины Ionic Native в Reactjs или Vuejs, которые все еще находятся в стадии бета-тестирования, но в этом нет ничего особенного.
Ниже приведен быстрый шаг за шагом, как интегрировать плагин video-capture-plus в приложение reactjs и развернуть его на устройстве ios с помощью Ionic Capacitor.
Мы будем использовать проект из предыдущего поста, который я написал, используя настраиваемый перехватчик реакции для загрузки файлов в firebase. В проект будет добавлен плагин видеозахвата, а затем мы изменим перехватчик firebase для загрузки большого двоичного объекта из видеоданных.
Я видел, как в прошлом люди рекомендовали cordova-plugin-media-capture, но качество получаемого видео ужасно
Установите компоненты, плагины
npm install cordova-plugin-video-capture-plus
npm install @ionic-native/video-capture-plus
npm install @ionic-native/core
Добавьте импорт
import {
MediaFile,
VideoCapturePlusOptions,
VideoCapturePlus,
} from "@ionic-native/video-capture-plus";
При использовании компонентов VideoCapturePlus в ReactJS машинописный текст - ваш друг, потому что он показывает, какие свойства и методы доступны для объектов.
В этом случае вам нужен MediaCapture.captureVideo
, который возвращает обещание, которое является носителем, который вы искали, или сгенерированной ошибкой.
const doMediaCapture = async () => {
let options: VideoCapturePlusOptions = {
limit: 1, duration: 30
};
let capture:any = await VideoCapturePlus.captureVideo(options);
console.log((capture[0] as MediaFile).fullPath)
};
Базовый код для домашнего компонента, содержащего кнопку. Событие щелчка запускает функцию активации камеры, и мы записываем вывод, чтобы подтвердить, что мы получили данные. Мы делаем этот первый шаг, так как нам нужно развернуть его на устройстве для записи видео.
//.. removed ionic imports for brevity const Home: React.FC<RouteComponentProps> = ({ history }) => {
return ( <IonPage id="home-page"> <IonHeader> <IonToolbar> <IonTitle>Inbox</IonTitle> </IonHeader> <IonContent> <IonButton onClick={() => doMediaCapture()}> VIDEO CAPATURE </IonButton> </IonContent> </IonPage> ); };
export default Home;
Если ваш код работает нормально и вы видите вывод в консоли, то вы готовы к следующему шагу, который заключается в развертывании приложения на вашем устройстве, чтобы вы могли фактически записывать видео.
Ниже приведены шаги по запуску приложения на iOS, шаги для Android аналогичны. Дополнительные сведения см. В документации по конденсаторам.
Развертывание на устройство с помощью конденсатора / интерфейса командной строки
ionic build
ionic cap sync ios
После внесения изменений в веб-код обычно выполняется следующая команда.
ionic cap copy ios
После изменений в собственном коде / плагинах
ionic cap sync ios
Откройте IDE
ionic cap open ios
Использование Live Reload для отладки приложения
При разработке остальной части приложения я использовал команды перезагрузки в реальном времени, которые перечислены ниже.
ionic cap run ios -l --external
ionic cap run android -l --external
Изменения в обработчике загрузки файлов Firebase
Необходимо изменить перехватчик реакции для обработки загружаемых видео. Чтобы упростить интерфейс ловушки, мы извлечем дополнительную информацию о типе mime и имени файла для видео в ловушке.
Посмотрев на тип большого двоичного объекта, можно определить, нужно ли добавлять правильное расширение к имени файла при его загрузке. мы сталкиваемся с этой проблемой, потому что в IOS тип пантомимы «quicktime» должен быть сопоставлен с расширением «.mov».
В этом примере мы предполагаем, что если это dataUrl, который мы получаем, то это изображение, поэтому мне не нужно вносить какие-либо изменения в ловушку на этом этапе, но для Blob мы должны учитывать изменение в типе mime со следующим кодом.
console.log("processing as File/Blob"); let fName = `${new Date().getTime()}`;
if (_value instanceof Blob) { if (_value.type.split("/")[1] === "quicktime") { fName = fName + ".mov"; } else { fName = fName + "." + _value.type.split("/")[1]; } }
// setting the firebase properties for the file upload let ref = storageRef.child("media/" + fName); return ref.put(_value);}
Получение большого двоичного объекта из файла
Нам нужно сделать дополнительный импорт, чтобы получить информацию о текущей платформе Capacitor.getPlatform
, и мы собираемся использовать файловую систему, поэтому нам также нужно импортировать File
и DirectoryEntry
.
import { CameraResultType, Capacitor } from "@capacitor/core";
import { File, DirectoryEntry } from "@ionic-native/file";
Я уверен, что есть лучший способ справиться с этим беспорядком, связанный с преобразованием пути к файлу, но это то, что у меня есть.
Нам нужно получить путь и имя файла из медиафайла и использовать комбинацию, чтобы преобразовать его в формат, который может быть прочитан файловой системой мобильного устройства. Мы достигаем этого, получая `DirectoryEntry
с помощью плагина File
let resolvedPath: DirectoryEntry;
let path = media.fullPath.substring(0, media.fullPath.lastIndexOf("/"));
if (Capacitor.getPlatform() === "ios") {
resolvedPath = await File.resolveDirectoryUrl("file://" + path);
} else {
resolvedPath = await File.resolveDirectoryUrl(path);
}
Как только мы получим разрешенный путь, мы можем прочитать файл в большой двоичный объект, используя File.readAsArrayBuffer
, и загрузить этот большой двоичный объект в firebase.
return File.readAsArrayBuffer(resolvedPath.nativeURL, media.name).then(
(buffer: any) => {
// get the buffer and make a blob to be saved
let imgBlob = new Blob([buffer], {
type: media.type,
});
setFileData(imgBlob);
},
(error: any) => console.log(error)
)
Хук пытается загрузить файл в firebase, когда когда-либо setFileData
вызывается с dataUrl
или Blob
, поэтому последняя часть - это вызов функции, предоставляемой хук useFirebaseUpload
, и запуск загрузки.
Вывод
Настоящая цель сообщения в блоге заключалась в том, чтобы попытаться объяснить, что происходит в соответствующем видео, и, надеюсь, это было полезно. Пожалуйста, посмотрите видео и предоставленный исходный код, а также оставьте комментарии и вопросы ниже.
Причуды Android
Конфигурация в plugin.xml
вызывает проблемы с плагином VideoCapturePlus
, и ее необходимо отредактировать для правильной работы. А пока я просто быстро отредактировал файл в каталоге node_modules
, чтобы раздел android выглядел так
<!-- android --> <platform name="android"> <config-file target="res/xml/config.xml" parent="/*"> <feature name="VideoCapturePlus"> <param name="android-package" value="nl.xservices.plugins.videocaptureplus.VideoCapturePlus"/> </feature> </config-file>
<config-file target="AndroidManifest.xml" parent="/*"> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> </config-file>
<source-file src="src/android/nl/xservices/plugins/videocaptureplus/VideoCapturePlus.java" target-dir="src/nl/xservices/plugins/videocaptureplus"/> <source-file src="src/android/nl/xservices/plugins/videocaptureplus/FileHelper.java" target-dir="src/nl/xservices/plugins/videocaptureplus"/> <source-file src="src/android/nl/xservices/plugins/videocaptureplus/xml/provider_paths.xml" target-dir="res/xml" /> </platform>
🔥 Связанные руководства 🔥
- Плейлист видео Ionic React: https://www.youtube.com/playlist?list=PL2PY2-9rsgl3OHIMYb1AzVG5wADUxOmUW
- Серия хуков Ionic и ReactJS: https://dev.to/ionic/react-ionic-framework-and-hooks-5135
- Ionic и ReactJS на конденсаторе: https://www.youtube.com/watch?v=bqNiaa0sZEg&list=PL2PY2-9rsgl3OHIMYb1AzVG5wADUxOmUW&index=8
🔥 Ссылки 🔥
- Исходный код: https://github.com/aaronksaunders/photo-video-react-cap-file-upload-hook
- Сообщение в блоге: https://dev.to/aaronksaunders/how-to-record-videos-in-reactjs-with-capacitor-and-cordova-plugins-276g
- Блоги на Dev.To: https://dev.to/aaronksaunders
- Блоги на Medium: https://medium.com/@c_innovative
- Компания Clearly Innovative Inc, занимающаяся веб-разработками: www.clearlyinnovative.com