Я пытаюсь загрузить видеофайлы на YouTube, используя API v3 и MediaUploader. Это работает в моем приложении ReactJS, но не в моем приложении React Native. При загрузке через React Native загрузка завершается, а затем останавливается на 100%. В моей учетной записи на YouTube я вижу новый видеофайл, но он застрял на «Видео все еще обрабатывается».
Мне кажется, проблема в том, что мне нужно отправить видео файл , а не объект с видео uri , но я не знаю, как обойти этоэто.
Я использую YouTube MediaUploader из примера CORS на https://github.com/youtube/api-samples/blob/master/javascript/cors_upload.js Я использую идентификатор клиента OAuth 2.0, и эта настройка работает правильно при использовании приложения ReactJS через мой веб-сайт. Я использую React Native Expo с камерой, которая возвращает мне объект с URI, например:
Видеофайл: Object {"uri": "file: /// var / mobile / Containers / Data /Приложение / 353A7969-E2A8-4C80-B641-C80B2B029555 / Библиотека / Кэши / ExponentExperienceData /% 2540dj_walksalot% 252Fwandereo / Камера / E971DFEC-AB3E-4B6D-892F-9027AFE47A1A.mov * Можно просмотреть * 101 * *3 *}в приложении, и я даже могу успешно отправить его на свой сервер для воспроизведения в веб-приложении и в приложении React Native. Однако отправка этого объекта в MediaUploader не работает. Для загрузки потребуется соответствующее время, но затем он будет равен 100%, в то время как мой аккаунт YouTube покажет, что он получил видео с правильными метаданными, но само видео по-прежнему застряло на «Видео все еще обрабатывается».
video_file: Object {"uri": "file: /// var / mobile / Containers / Data / Application / 353A7969-E2A8-4C80-B641-C80B2B029555 / Библиотека / Caches / ExponentExperienceData /% 2540dj_walksalot% 252Fwandeo/Camera/E971DFEC-AB3E-4B6D-892F-9027AFE47A1A.mov ",}
export const uploadToYouTube = (access_token, video_file, metadata) => async (dispatch) => {
...cors_upload...
var uploader = new MediaUploader({
baseUrl: `https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus&key=API_KEY`,
file: video_file,
token: access_token,
metadata: metadata,
contentType: 'video/quicktime',
// contentType: 'application/octet-stream',//"video/*",
// contentType = options.contentType || this.file.type || 'application/octet-stream';
params: {
part: Object.keys(metadata).join(',')
},
onError: function(data) {
// onError code
let err = JSON.parse(data);
dispatch(returnErrors(err.message, err.code))
console.log('Error: ', err);
},
onProgress: function(progressEvent){
// onProgress code
let percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
dispatch({
type: UPLOAD_PROGRESS,
payload: percentCompleted
});
},
onComplete: function(data) {
console.log('Complete');
// onComplete code
let responseData = JSON.parse(data);
dispatch({
type: UPLOAD_YOUTUBE_VIDEO,
payload: JSON.parse(data)
})
dispatch({
type: UPLOAD_PROGRESS,
payload: 0
});
}
});
uploader.upload ();}
По аналогии с моим текущим веб-приложением, после завершения загрузки должна сработать функция onComplete, а YouTube должен обработать видео. Такого не бывает. Я полагаю, что это потому, что я прикрепляю объект с URI, а не с самим файлом.