#7 Android MVVM Architecture Tutorial – Handling API Exceptions

여러분 안녕하세요! 이것은 Belal Khan이고 당신은 Simplified Coding을보고 있습니다 모든 것이 당신 편에 있기를 바랍니다

이 비디오를 진행하기 전에이 비디오를 일시 중지하고 앱 아래에 댓글을 달아주십시오 지금까지 일하고 있습니다 이 비디오에서는 API 호출 코드를 약간 변경합니다 잘 작동하지만 전화를 좀 더 추상적으로 만들고 싶습니다 또한 한 곳에서 오류를 처리하고 싶습니다

보시다시피 UserRepository 내에 userLogin이 있습니다 그리고 그것은 우리에게 AuthResponse 유형의 응답을 제공하지만 ViewModel에 대해 걱정하고 싶지 않습니다 확인해야 할 때마다 ViewModel에서 응답을 얻는 것처럼 응답 responseisSuccessful 한 곳에서이 작업을하고 싶습니다

이를 위해 API 요청을 수행하는 일반 함수를 작성해야합니다 응답을 반환합니다 따라서이 일반 함수에서 Response 유형의 Response를 직접 얻을 수 있습니다 이 경우에는 AuthResponse가 있습니다 따라서 네트워크 패키지 안에 클래스를 하나 더 만듭니다

여기서 오류를 처리하므로이 클래스의 이름을 SafeApiRequest로 지정하십시오 SafeApiRequest 파일이 있습니다이 파일 안에 추상 클래스를 만들겠습니다 SafeApiRequest 와이 클래스 내에서 또 다른 일시 중단 일시 중단 기능을 만들 것입니다 네트워크 작업을 수행하려고하며 비동기 작업입니다

비동기 작업에는 일시 중단을 사용합니다 그래서 우리는 재미를 중단했고이 함수는 일반적인 함수이므로 여기서 정의하겠습니다 Any 유형의 T 이 함수는 api를 수행하기 때문에이 함수의 이름을 apiRequest로 지정합니다 의뢰 이 함수는 T를 반환합니다

이제이 함수로 API 호출을 전달하고 이 호출은 또 다른 일시 중단 기능입니다 따라서 매개 변수가없는 일시 중단 기능이 있으며이 함수는 응답을 반환합니다 T 형으로 끝났습니다 이제이 함수 apiRequest 내에서 호출을 호출하고 응답을 얻습니다 따라서 val 응답은 call

invoke ()와 같습니다 이제 API 호출의 응답이 있으며 응답이 성공적인지 확인할 수 있습니다 responsebody를 반환하고 null이 아닌지 확인하십시오 응답이 성공하면 응답 본문이 있기 때문입니다 응답이 성공하지 못한 경우 오류를 처리하므로 먼저 응답 오류 본문에서 오류가 발생했습니다

val error = responseerrorBody ()가 있습니다 따라서 응답이 성공하지 못하면 본문을 얻을 수 없지만 errorBody () errorBody ()에서 문자열을 가져 오므로 오류에 응답이 무엇이든간에 그 문자열 형식을 가져옵니다 먼저 API를 보여 드리겠습니다 우린 POSTMAN이 있습니다

따라서 로그인 시도가 잘못되면 상태 코드가 401이며 401과 같은 응답 코드는 오류이므로 다른 것으로 들어갑니다 블록 else 블록 안에서 JSON 문자열 인이 문자열을 얻습니다 따라서 API 코드에서 정의한 오류 응답을 얻는 경우 좋아, JSON 응답을 구문 분석 할 수 있지만 때로는 404와 같은 오류가 발생할 수 있습니다 API를 찾을 수 없거나 호스트가 작동하지 않으므로 JSON을 얻지 못합니다

응답 본문 그러나 JSON의 유효성을 검사하기 전에이 오류가 null이 아닌지 확인해야합니다 그래서 우리는 error?let을 확인 하고이 let 블록 안에서이 오류를 변환 할 것입니다 JSON 객체에 대한 문자열입니다

그러나 오류 응답에 JSON 객체가있는 경우에만 JSON 객체로 변환 할 수 있습니다 따라서 API 에서이 오류를 코딩하면 JSON 응답, JSON 오류 응답이 있지만 오류가 다른 경우 API Not과 같은 JSOn 응답을 얻지 못합니다 찾거나 호스트가 작동하지 않습니다 따라서 JSON 공명을 변환하기 위해 시도하고 잡아야합니다 문자열을 확인하는 것은 JSON 객체로 변환 가능 여부입니다

내부에서 문자열을 JSON 객체로 변환하면 오류 메시지가 나타납니다 내 API를 디자인 할 때 오류 응답의 경우 항상이 메시지 키가 있습니다 오류 메시지를 포함합니다 그래서 당신은 또한 내 API를 사용하고 있으므로이 경우 아무런 문제가 없습니다 그러나 애플리케이션에서 작업 할 때 이에 따라 API를 설계해야합니다

여기이 문자열에있는 JSON 객체에서 오류 메시지가 나타납니다 또는이 문자열에있을 수도 있습니다 JSONObject를 작성하고 전달한 다음이 JSONObject에서 문자열이며 메시지입니다 따라서 오류 응답에 JSON 응답이 있으면 메시지가 표시되지만 오류 응답에 json 응답이 없으므로이 catch 블록 안에 들어갑니다 하지만이 캐치 블록 안에서는 아무것도하지 않습니다

catch 블록 우리는 오류 코드 인 응답 코드 만 표시하지만 오류가있을 때 표시 할 메시지가 표시됩니다 여기서 내가 할 일은 StringBuilder를 만들어서 이 StringBuilder 이제이 메시지를 작성하는 대신 여기에 messageappend를 작성할 수 있습니다 우리가 가진 오류 메시지

잘라서 붙여 넣습니다 그래서 우리는이 StringBuilder 안에 오류 메시지를 가지고 있습니다 내 메시지에 새로운 줄 새로운 줄을 추가해 봅시다 그리고이 let 블록 다음에 메시지 StringBuilder에 오류 코드를 추가합니다

그래서 여기에 messageappend를 작성하고 오류 코드를 추가하고 이 응답 객체의 오류 코드 여기에 $ {responsecode ()} 응답을 작성하겠습니다 우리는 메시지를 받았습니다 첫 번째 줄에는 오류 메시지가 있고 두 번째 줄에는 에러 코드

그런 다음 우리는 예외를 던질 것입니다 API 예외를 처리하기 위해 사용자 정의 클래스 ApiException을 만듭니다 이 프로젝트에서 원하는 모든 사용자 정의 예외는 유틸리티 패키지 여기에 새로운 kotlin 파일을 만들어 보도록하겠습니다 그리고이 파일 안에 모든 클래스를 만들 것입니다

우리가 원하는 첫 번째 클래스는 ApiException이며이 클래스는 문자열 유형의 메시지를받습니다 생성자 매개 변수로 사용하면 IOException이 상속됩니다 그리고 우리는 메시지를 IOException에 전달할 것입니다 이제 SafeApiRequest로 돌아와서 여기서 ApiException을 발생시킵니다 따라서 throw ApiException ()을 작성하고 message

toString ()을 전달합니다 메시지를 보내면이 메시지를 문자열로 변환합니다 따라서 오류가 발생하면 ApiException이 발생합니다 이제 일반 함수가 준비되었으며이 함수를 사용하여 API를 수행합니다 의뢰

따라서 UserRepository 클래스에 들어가면이 클래스는 SafeApiRequest를 확장합니다 이제 여기에서 만든이 함수를 사용할 수 있습니다 API를 수행하기위한 apiRequest입니다 UserRepository 클래스 내부에서 요청하십시오 그래서 내가 할 일은 여기에 apiRequest를 반환 하고이 apiRequest 안에 MyApi ()를 호출 한 다음 userLogin 및 이메일 비밀번호를 입력하십시오

이제 반환 유형을 AuthResponse로 변경할 수 있습니다 이제 함수가 AuthResponse를 직접 반환하므로 AuthViewModel로 돌아와서 여기서 AuthResponse를 직접받습니다 val authResponse = UserRepository () userLogin ()과 같이하겠습니다 이메일과 비밀번호도 마찬가지입니다

실제로 authResponse와 동일한 줄을 작성했지만 여기서는 응답이 성공적인지 확인하지만이 authResponse를 try 및 잡기 그리고 우리는 ApiException을 잡아야합니다 우리는 ApiException 타입의 e를 가지고 있습니다 이제 오류가 발생하면 authListener? onFailure ()를 호출하고 전달합니다

이 예외 인스턴스에서 가져올 메시지 emessage를 전달할 수 있습니다 그리고 null이 아닌지 확인할 수 있습니다 authResponse가있는 경우 authListener? onSuccess ()를 호출하면 authResponse의 사용자이므로 authResponse

user를 작성하면됩니다 null이므로 여기에 authResponse? user를 작성하고 사용자가 null이 아니다 사용자가 null이 아닌 경우 onSuccess를 호출하고 전달합니다 null이 아니다 사용자가 null 인 경우 다시 onFailure ()를 호출하여 메시지를 얻을 수 있습니다 authResponse에서 authResponse

message !!를 작성합니다 이 성공 후에는 return을 호출하여이 행을 실행하지 않습니다 성공하면 끝입니다 나는 그것이 작동해야한다고 생각하므로 응용 프로그램을 실행 해 봅시다 빈 값을 입력하면 유효하지 않은 이메일 또는 비밀번호가 표시됩니다

올바른 값을 입력하면 "Belal Khan이 로그인되었습니다"라는 메시지가 나타납니다 그래서 그것은 절대적으로 잘 작동합니다 오류가있는 경우이 작업도 시도해보십시오 잘못된 이메일 또는 비밀번호, 오류 코드 401이 표시됩니다 그래서 그것은 절대적으로 잘 작동합니다

그러나이 토스트 대신 스낵바를 표시하고 싶습니다 레이아웃 파일에서 볼 수 있듯이 coordinator_layout을 사용했습니다 coordinator_layout입니다 토스트 대신 스낵바를 사용하고 싶기 때문에이 레이아웃을 사용합니다 그리고 다시 스낵바를 위해 하나 이상의 확장 기능을 만들 것이므로 ViewUtils에 들어 오십시오

여기에서는 View의 확장 기능을 만듭니다 그래서 재미있는 Viewsnackbar를 작성 하고이 함수는 우리가 원하는 메시지를 가져옵니다 이 스낵바 안에 표시합니다 그리고 여기에 snackbar

make를 작성할 수 있으며 그것이 취하는 첫 번째 매개 변수는 View입니다 이 함수는 View의 확장이기 때문에 여기에 View가 있으므로 간단히 전달할 수 있습니다 여기 요 그런 다음 두 번째 매개 변수에 대해 표시하려는 메시지와 세 번째 매개 변수는 스낵바의 길이를 가지므로 스낵바를 갖습니다 그리고 나는 또한 쓸 것이다 그리고 이것은 또한 우리에게 스낵바를 줄 것이다 이제이 스낵바에 다음과 같이 조치를 설정하여 snackbar

setAction 및 버튼 이름을 Ok로 지정하고 클릭 기능 내부에 있습니다 이 함수 내에서 실제로 람다, 또는 람다 나는 스낵바를 닫을 것입니다 그래서 snackbardissmiss ()를 작성하고 마지막으로이 중괄호 뒤에 스낵바를 표시하려면 show () 토스트 대신에이 스낵바를 사용할 수 있지만이 스낵바를 사용하는 것은 매우 쉽습니다

coordinator_layout이 필요합니다이 coordinator_layout에 root_layout 인 id입니다 그래서 이것을 사용할 수 있으므로 LoginActivity로 돌아와서 토스트 대신 root_layoutsnackbar를 작성합니다 그런 다음 표시하려는 것과 동일한 문자열을 전달합니다

이제 토스트를 삭제하면 어디에서나 같은 것을 사용할 수 있습니다 따라서 실패의 경우 실패 메시지를 표시하고 양호합니다 따라서 응용 프로그램을 다시 실행하면 이번에는 스낵바가 표시됩니다 스낵바가 작동하는 것을 볼 수 있습니다 이제 잘못된 비밀번호를 입력하십시오

그리고 잘 작동하고 있습니다 토스트보다 낫다고 생각합니다 이 비디오 친구를위한 모든 것입니다이 강의를 즐기 셨으면 좋겠습니다 네 편이야 문제가있는 경우 아래 의견에 알려주십시오

이 비디오를 좋아하고 친구들에게 공유하십시오 이것이 지금 Signing Off 인 Belal Khan입니다

Android Dev Summit, Web Components v1 APIs, & bigger rewards for security bugs!

[음악 재생] 토드 커맨 : 안녕하세요 "개발자 쇼"의 Todd Kerpelman입니다

이것은 가장 멋진 개발자에 대한 주간 업데이트입니다 Google 뉴스 항상 매력적인 서니 베일, 캘리포니아를 방문하고 싶습니까? 그러나 옳은 변명을 한 적이 없었습니까? 글쎄, 당신은 운이 좋다 2019 Android Dev Summit에 등록되었습니다 Dev Summit은 새로운 Android를 배우기에 좋은 곳입니다

개발 기술, 의견 및 아이디어 공유 Android 엔지니어링 팀과 다른 개발자와 연결 전세계에서 이틀 회의는 10 월 23 일부터 Google 이벤트 센터에서 24 세까지 그리고 신청 방법을 포함한 모든 세부 사항은 게시물에 있습니다 웹 구성 요소 API는 웹 플랫폼 표준입니다 말 그대로 수백만 개의 사이트에서 사용되며 매일 수십억 명의 사용자가 그러나 Draft v0 API는 Chrome에서만 지원되었습니다 그리고 웹 팀은 모든 개발자를 밀고 있습니다 가능한 빨리 v1로 업그레이드합니다 그러나 많은 사람들이 더 많은 시간을 요구했기 때문에 최신 API, 팀으로 마이그레이션 Chrome 73에서 공식 삭제 시간을 뒤로 밀고 있습니다

2020 년 초에 출시 될 Chrome 80에 여전히 현재보다 더 나은 시간은 없습니다 최신 버전의 웹으로 마이그레이션 구성 요소 그 일을하는 방법에 대한 지침은 게시물에 있습니다 Chrome에 대해 말하면 Chrome 팀 더 큰 보상을 발표하게되어 기쁘다 보안 버그 찾기 Chrome 취약점 보상 프로그램 항상 연구원들에게 보상하는 좋은 방법이었습니다 보안 찾기 및보고 사용자의 안전을 지키는 버그 그리고 이번 주, 그들은 전반적으로 발표합니다 보상 금액이 증가합니다 보상 프로그램에 대한 자세한 정보 시작하는 방법을 알아 보려면 보안 버그를 사냥, 게시물을 확인 아래 설명에서

당신은 항상 자신의 약간 미친 찾고 박제를 원하십니까 설치류? 어, 사실이야, 당신은 좀 미쳤어 글쎄, 당신에게 좋은 소식이 있습니다 바둑 팀은 새로운 브랜드를 시작했습니다 장식과 상점을 찾으십시오 자신 만의 Go 테마 까마귀, 양말 또는 그렇습니다 봉제 인이지만 수익금의 100 %가 직접 비영리 단체 인 Go Bridge에 불충분 한 그룹에게 기술력을 가르치는 바둑 공동체의 다양성 증진

그래서 당신은 자신을 위해 멋진 물건을 구입할 수 있습니다 여전히 기분이 좋습니다 업계에서 우리는 윈윈 (win-win)이라고 부르는 것을 좋아합니다 승인 당신의 부분은 끝났습니다 모든 애니메이터에게주의하십시오

해밀턴 앱 제작자, 멋진 툴인 플레어 Flutter를위한 훌륭한 애니메이션 제작을 위해 볼 디자인 도전을 실행 가장 흥미로운 플레어 기반 애니메이션을 제작할 수있는 사람 해밀턴 앱 최고 항목은 멋진 장식을 이길 것입니다 애니메이션을 앱에 소개합니다 그리고 Lin-Manuel Miranda 자신도 안아줍니다 알기 위해 기다려요 죄송합니다

여기에 무언가를 건네고 있습니다 음, 안타깝게도 상금이 포함되지 않는다고 들었습니다 그리고, 어 이것도 제지 명령을 받았습니다 글쎄요, 그것은 공평합니다

어쨌든 신청 및 컨테스트 방법에 대한 세부 정보 규칙은 게시물에 있습니다 좋아요, 구독 및 / 또는 공유하는 것을 잊지 마십시오 저는 Todd Kerpelman이고 Go Gopher입니다 "개발자 쇼" 시청 해 주셔서 감사합니다 다음 주에 see겠습니다

사실, 당신이 아니라, 당신은 해고당했습니다 죄송합니다 나-클래 피 일을 할 수 있습니까? 발표자 : 할 수 있습니다 토드 커맨 : 좋아요 [음악 재생]

Google I/O 2013 – Broadcast Yourself!: Using the YouTube Live APIs to Stream to the World

SATYAJEET SALGAR : 좋습니다 여러분 좋은 오후입니다

여기에 와서 온라인을 시청 해 주셔서 감사합니다 내 이름은 Satyajeet Salgar 다 나는 이브라힘과 함께있다 YouTube Live 플랫폼에 대해 이야기하고 있습니다 YouTube 라이브 API 플랫폼에 대해 조금 이야기 할 것입니다

제작자가하고 있습니다 이브라힘 (Ibrahim)은 API에 대한 세부 정보를 제공하고 너 데모 야 그리고 우리는 질문을 위해 약간의 시간을 절약 할 것입니다 그거 괜찮은가요? 우리는 또한 라이브로부터 질문을 취할 것입니다 Google 포럼 포럼에서 잠재 고객을 스트리밍 온라인을 참조하십시오

그래서 우리는 당신의 질문을 기다리고 있습니다 괜찮아 라이브 스트리밍 데모로 라이브 스트리밍 토크입니다 라이브 스트리밍되지만, 우리는 더 깊이 갈 수 있습니다 누군가 살아있는 우리가

그래서 가능합니다 YouTube 얼마나 많은 사람들이 YouTube를 보았습니까? 지난 달 비디오? 당신은 10 억 인구의 일부입니다 인터넷에 지금있는 사람들 그들은 매달 60 억 시간을 지켜보고 있습니다

플랫폼 전반에 걸쳐 따라서 전세계에서 우리의 의견 중 25 %가 모바일 장치에 있습니다 YouTube는 전 세계에서 가장 큰 검색 엔진이기도합니다 YouTube와 동영상은 YouTube와 참여를 유도하고 위대하게 창출하십시오 귀하의 청중을위한 경험 우리는 특히 라이브를 생각합니다

그래서 YouTube에서의 라이브에 대해 조금 이야기 할 것입니다 얼마나 많은 사람들이이 이미지를 인식합니까? 거의 모든 사람 그러니 10 월 14 일에 펠릭스 바움 가르트 너 (Felix Baumgartner)의 이름으로 오스트리아 신사가 들어 섰다 그 우주 캡슐은 우주로 24 마일 올라가서 내려다 보았다 뉴 멕시코를 넘어서서 뛰어 올랐다

점프는 약 10 분이었고 그는 자유 낙하했습니다 약 4 분 이것은 우리가 인터넷 트래픽을 본 것입니다 그 기간 네

언젠가는 저처럼 두 사람이 언론에 남았습니다 회의 그러나 이것이 최고였습니다 그리고 그 절정에, 82 백만명의 사람들이 조정되었습니다

그리고 5200 만 건의 재생이 있습니다 그것은 라이브 이벤트의 규모와 흥분의 종류입니다 YouTube에서 생성 할 수 있습니다 그건 그렇고, 재미있는 퀴즈 조각, 그 시점에서 – 그 4 분 – 모든 인터넷의 약 8 % 트래픽이 그 비디오였습니다 다행히도, 당신은 공간을 뛰어 넘어 창조 할 필요가 없습니다

멋진 라이브 엔터테인먼트 우리는 톤과 수 많은 파트너가 오늘은 유튜브에 왼쪽 상단에 왼쪽, 축구 강국 때마다 러시아 스파르타 크 모스크바에서 활약하며 라이브 트래픽 러시아 스파이크에서 라이브 스포츠는에 대한 엔터테인먼트를 구축하는 좋은 방법입니다 YouTube, 인도 크리켓 또는 메이저 리그 생중계하는 야구는 국제적으로 게임을 스트리밍합니다

NBA 발달 리그 아니면 누구나 쉽게 찾을 수있는 스포츠입니다 세계 어디서나 찾을 수 있습니다 예를 들어, 호주에서 서핑, 소년 고등학교 인도네시아 축구, 배드민턴, 현지 하키 인도 -이 모든 것 경험은 YouTube에 게시됩니다 잠재 고객이이를 찾고 채널이 YouTube에 잠재 고객을 구축합니다

그러나 스포츠에 대한 우리의 비전은 단순한 게임이 아닙니다 우리는 게임 주변에 수많은 라이브 자료가 있다고 생각합니다 너가 강당에 들어갈 때 터널 캠이야 그 후에 인터뷰인지 여부 이것들은 모두 라이브 스포츠 경험의 일부입니다

얼마나 많은 사람들이 유벤투스가 누구인지 압니까? 그다지 많은 사람들이 좋아, 몇 사람 그래서 유벤투스는 이탈리아 축구 클럽입니다

그들은 리그에서 우승했습니다 클럽이 함께 할 때 생방송입니다 온 마을이 승리를 축하했다 수만명의 사람들이 들어 봤고 그들의 글로벌 팬들도 참여할 수 있습니다 우리는이 톤과 톤의 차원에서 일어나는 것을 봅니다

음악은 또 다른 훌륭한 음악입니다 울트라 뮤직 마이애미 축제, 일본의 코 첼라, AKB48, 또는 그의 새 앨범을 데뷔 한 신사 (PSY)는 YouTube의 실시간 스트리밍 우리는 모든 종류의 아티스트가 YouTube에 온 것을보고 있습니다 잠재 고객에게 멋진 라이브 경험을 제공합니다 그리고 우리는 이것이 시작에 불과하다고 생각합니다 우리는 이것이 모든 종류의 독립 예술가

그리고 나는 예술가들이 음악가 그 이상을 의미한다고 말합니다 물론 우리는 게임이 게임의 큰 부분이 될 것이라고 생각합니다 YouTube에 생방송 우리는 이미 많은 것을 가지고 이것을 보게됩니다 플랫폼에서 나오는 e-sports 토너먼트

라이드 게임은 예를 들어, 리그 오브 레전드 (Legends of Legends) 토너먼트 우리는 톤수를 더보고 있습니다 Google은 최근 Call of Duty와의 API 통합을 수행했으며, Black Ops II : 실제로 스트림을 라이브 스트리밍 할 수 있습니다 멀티 플레이어 게임 플레이 자, 우리 모두는 누군가를 보는 것의 가치를 이해합니다

누가 정말 좋은 연극이지, 그렇지? 그러나 그것은 그 이상으로 확장됩니다 예를 들어, 몇 주 전, 의무 선반에 전화하자 놀고있는 누군가에게 비틀 거린다 그리고 몇 초 안에 꽤 명확 해졌습니다 이 사람은 실제로 좋지 않았다고

하지만 갑자기, 그녀는 일시 중지하고 실제로 채팅을 시작했습니다 청중이 말하는, 이봐, 고마워 나는 놀고있는 걸 보았습니다 나는 내가 그렇게 위대하지 않다는 것을 알고 있지만, 나는 훨씬 나아지고있다 그리고 이것이 제가 최근에 한 일입니다

이제 그녀를 지켜보고 있던 두 세명의 행동 그녀의 경험을 더 좋게 만들었습니다 그것은 그녀를위한 단순한 게임 그 이상의 것이되었습니다 이것이 라이브 스트리밍과 연결의 힘입니다 YouTube에서 매일 보는 시청자 그리고 그것은 모든 종류의 엔터테인먼트로 확장되며, 제품 출시 여부와 정확히 일치하는 회의 이것, 또는 매우 정교한 에이프릴 바보 장난

사람들은 YouTube April Fools의 장난을 인정합니다 오른쪽 상단? 몇 사람? 네, 12 시간 동안 진행된 실시간 스트림이었습니다 이 매우 용감한 앵커들이 실제로 제목을 읽고 기본적으로 수십만 개의 YouTube 동영상 아니면 레드 카펫 첫날 같은 무언가 우리가 뭘 더 잘할 수 있을까요? 상단의 멀티캠을 확인하십시오

다른 곳에서는 이것을 할 수 없습니다 그래서 우리는 단지 하나의 특정한 견해를 스트리밍하는 것이 아닙니다 그러나 우리는 청중들에게 그들은 가고 싶었다 우리는 장르 전반에 걸쳐이를 수행 할 수 있습니다 예를 들어 최근 PGA 라이브 타이거 우즈가 나왔다

그래서 타이거 우즈를 따라 가려면 토너먼트에서 실제로 그렇게 할 수 있습니다 물론 이것은 훨씬 더 많이 확장됩니다 또한 뉴스와 시사 문제도 다루고 있습니다 우리는 YouTube에 교황이 있었다 YouTube에서 대통령 토론회를 가졌습니다

미국 대통령 토론 오른쪽 상단에서 보신 것은 최초입니다 케냐의 대통령 토론 케냐에서는 교통량이 급증했습니다 그것이 무엇인지 궁금합니다 그리고 그것은이 사건으로 밝혀졌습니다

수많은 국제 뉴스 채널 YouTube에서 실시간 방송 그리고 물론, 우리는 많은 주제를 다루고 있습니다 이제 우리는 제작자가하는 모든 것에 정말 흥분하고 있습니다 커뮤니티가 YouTube에서하고 있습니다 그러나 이것을 가능하게하는 것은 무엇입니까? 우리가 정말로 흥분하는 것은 강력한 솔루션입니다

우리가 만든 것 YouTube 엔지니어링 팀이 마지막으로 열심히 노력했습니다 해결책을 구축하기 위해 2 년 나는 기분이 좋았다 시청자에게 최고의 스트림 품질을 제공합니다 우리는 적응 비트율과 같은 것을 제공합니다

따라서 이동하면서 대역폭이 변경되면 스트림 품질에 손실이 발생하지 않습니다 스트림에서 앞뒤로 건너 뛸 수 있도록했습니다 그리고 우리는 여러 장치를 통해 작업합니다 그래서 당신이 당신의 데스크탑에서나 당신의 전화, 그냥 작동합니다 비교할 수없는 규모와 품질

광고 작성자는 광고를 쉽게 삽입 할 수있는 기능을 제공하며, 우리에게 단 하나의 고품질 스트림을 보내려면 모두 클라우드에서 실시간으로 트랜스 코딩하고, 필요한 모든 장치와 해상도 우리는 당신에게 여러 카메라 각도를 제공합니다 광고 삽입을 허용합니다 우리는 당신이 슬레이트를하도록합니다 닫힌 캡션을 삽입하는 것이 정말 쉽습니다

훨씬 더 많은 것이 있습니다 우리는 지금 막 시작하고 있습니다 우리는이 플랫폼을 계속 구축 할 것입니다 우리의 제작자 커뮤니티와 개발자 우리는 라이브 API를 출시하여 파트너 및 개발자 믿어지지 않는 것들을 지어 라

모든 베타 파트너에게 감사드립니다 너는 방에있다 이 API를 성장시키는 데 도움을 주셨습니다 그리고 우리는이 일로 더 많은 것을 알고 있습니다 마지막으로, 우리가 정말로 흥분하는 사실은 우리는이 플랫폼을 제작자가보다 쉽게 ​​이용할 수 있도록 만들고 있습니다

어제 YouTube에서 YouTube를 통해 1,000 명의 가입자가 실시간으로 스트리밍 할 수 있습니다 우리는 이것이이 플랫폼을 더욱 가치있게 만들 것이라고 생각합니다 를 위해 개발하십시오 그리고 우리는 제작자가 커뮤니티는 당신이 어떻게 활용할 수 있는지도 알고 있습니다 개발자로서

이를 통해 Ibrahim에게 API에 대해 알려주시겠습니까? 이브라힘 울루 카야 : 물론입니다 그래서 저는 Ibrahim Ulukaya, 개발자입니다 YouTube의 프로그램 엔지니어 오늘은 API 자체에 대한 개요를 실제로 제공하겠습니다 그런 다음 설정을 제안하려고합니다

라이브 스트리밍을 위해 그리고 우리는 자바 샘플 코드를 조금씩 살펴 보겠습니다 결국에는 Android 데모가 실제로 표시됩니다 우리가 살기 시작한 이래로 우리는 그것을 보게 될 것입니다 시작하자

YouTube 라이브 스트리밍 API 실시간 스트리밍 API를 사용하면 실제로 일정을 잡을 수 있습니다 YouTube에서 실시간 이벤트를 업데이트하고 관리합니다 나만의 스트림을 인스턴스화하고이를 발생시킬 수 있습니다 이러한 이벤트 내부

YouTube 콘텐츠 파트너 인 경우 광고 지금은 개념에 대해 조금 이야기하고 싶습니다 오늘 제가 이야기하고 싶은 첫 번째 개념은 방송입니다 캘린더 일정처럼 방송을 생각해보십시오 뉴스 같은 쇼

일정 시간 동안 예정되어 있으며 이벤트 컨테이너처럼 YouTube / 라이브로 이동하면 이 사진 지금 일어나고있는 사건을 볼 수 있습니다 또는 미래의 일정을 계획하고 있습니다 두 번째 개념은 스트림입니다

스트림이란 YouTube에 전송하는 스트림입니다 이러한 이벤트의 시작점입니다 그래서 저는이 두 가지를 구별하고 싶습니다 방송은 사건입니다 – 특정 시간에 예정된 일정 스트림은 나만의 콘텐츠입니다

YouTube 진입 점 그래서 실제로 이것들을 다루고 있습니다 방송은 이벤트였습니다 이벤트 메타 데이터, 스트림이 실시간 귀하의 콘텐츠를 스트리밍 우리가 헤어질 수 있었던 이유는 유연성을 제공하여 여러 스트림을 보유 할 수 있습니다

해당 스트림에 대해 해당 스트림을 전환 할 수 없습니다 브로드 캐스트 이벤트 자체 그리고 만약 당신이 아마 당신의 스트림을 가지고 있다면, 당신은 그 스트림, 같은 스트림을 사용하고 싶을 수도 있습니다 처리 설정을 다른 이벤트로 보냅니다 그래서 우리는 융통성있게 만들어서이 둘을 분리했습니다

마지막으로 큐 포인트입니다 Cuepoint는 인스 트림 광고입니다 파트너 API를 기반으로합니다 YouTube 콘텐츠 파트너 인 경우 광고 삽입 그럼 어떻게 서로 놀 수 있죠? 내가 말했듯이, 방송은 사건입니다

그리고 당신이 당신의 시내를 원할 때 – 귀하의 콘텐츠가 이벤트에 나타나면 그냥 바인딩하는 것입니다 함께 광고를 삽입하려면 광고를 이벤트에 삽입하는 것 이 스트림을 브로드 캐스트, 스트림 이 방송에있을거야 이 이벤트 내부로 스트리밍됩니다

다른 스트림을 원하면 연결할 수 없습니다 항상 일대일 매핑이 있습니다 맞아, 이제 나는이 개념들에 대해 깊이 생각하고 싶다 그래서 브로드 캐스트는 메타 데이터입니다 제목, 설명, 예정 시간이 있습니다

비공개 또는 공개 이벤트로 만들 수 있습니다 새로운 플랫폼을 사용하면 실제로 녹음을 사용할 수 있습니다 따라서 사용자가 실시간 스트리밍을 보지 못하면 사용자가 갈 수도 있습니다 나중에 YouTube에서 동영상을 볼 수 있습니다 그리고 DVR 설정을 사용하도록 설정할 수 있습니다

동영상 내에서 앞뒤로 이동할 수 있습니다 이것은 이벤트 일정을 계획하고있었습니다 그리고 이벤트 라이브 사이클을 관리하는 것은 어떻습니까? 따라서 처음 이벤트를 만들면 시작됩니다 창조적 인 슬레이트로 그리고 그들을 묶어서 준비가되면 시작, 우리는 준비 상태에 있습니다

따라서 사용자는 곧 이벤트가 시작된다는 것을 알게됩니다 옵션 상태로 미리보기로 이동할 수 있습니다 그래서 이것은 실제로 좋은 상태입니다 이벤트가 진행되면 스트림을 모니터링 할 수 있습니다 우리는 거기에 갈 수있는 또 다른 모니터 URL을 보내고 공개되기 전에 스트림을 볼 수 있습니다

그리고 갈 준비가되면 마법이 일어납니다 그것은 스트리트 라이브갑니다 그리고 모든 좋은 일은 어느 시점에서 끝나야합니다 이걸 끝내고 싶으면 그냥 사이클을 완료하십시오 그 개울은 어쩌고? 스트림이 진입 점이었습니다

YouTube에서 스트리머와 이야기하는 곳입니다 그래서이 진입 점을 만듭니다 기억할 수 있도록 자신의 이름을 설정했습니다 그런 다음 지원하려는 가장 높은 비트 전송률을 설정합니다 지원하려는 가장 높은 해상도를 설정합니다

스트림에 대해 정말로 중요한 한 가지는 항목입니다 포인트를 만들면 실제로 RTMP URL 및 스트림 이름을 사용하면 어디에서 너는 이것들에 접근하기 위해 말할 것이다 스트림, 당신의 깃발을 보내십시오 그리고 최근의 것이 큐 포인트입니다 설명했듯이 인스 트림 광고였습니다

인스 트림 광고를 시작하고 오래있을 것입니다 그들이 어떻게 상호 작용하는지 기억합시다 다시 서로 스트림이 방송에 바인딩되어 스트림이이 이벤트에 발생합니다 한 번 광고를 삽입하려면 콘텐츠 파트너 인 경우 삽입물을 사용하고 있습니다

그래서 얼마나 많은 사람들이 라이브 스트리밍을 사용 했나요? 전에 어떤 채널에서? 좋아, 나는 약간을 본다 그리고 얼마나 많은 사람들이 인코딩과 디코딩을 사용할지, 아마도 실시간 스트리밍이 아닌가요? 승인 나는 몇 가지 더 많이 본다 그리고 아마도 지금 궁금해하실 것입니다 개념 및 API를 제공하지만 최고의 실시간 스트리밍은 어떨까요? YouTube 설정 지금 당장이 새로운 플랫폼으로 모든 표준 비트 전송률 지원, 모든 표준 해상도는 240p에서 최대 1080p입니다

이 제품의 가장 큰 특징은 이 모든 다른 비트 전송률을 보내십시오 YouTube에 대한 결의안 원하는 가장 높은 비트 전송률을 보내고 싶습니다 지원, 가장 높은 지원하려는 해상도 그리고 거기에서, 실시간으로, 우리는 그것을 모두에게 낮은 자질

그래서 대역폭을 절약하고 있습니다 처리 능력을 저장하고 있습니다 그리고 우리는 당신을 위해 전체 무거운 것을 할 것입니다 엔코더는 어떻습니까? 현재 RTMP 플래시 스트리밍을 지원하고 있습니다 그리고 당신은 H

264 비디오를 사용하고 싶습니다 구형 코덱의 경우 AAC를 지원하고 있습니다 앞에서 설명했던 것과 유사하게 코드 변환 된 낮은 비트 전송률, 다른 코드로 변환 콘테이너 및 다른 자질 그래서 사람들 iOS, Android 및 Google TV에서 제공되는 뿐만 아니라 스트림 따라서 당신은 당신이 어떻게 변할 것인지 생각할 필요가 없습니다 다른 설정으로 스트리밍하십시오

우리는 당신을 위해 이것을 할 것입니다 그래서 이것은 첫 번째 스트리밍이었습니다 설정 및 API 개요 그리고 당신이 실제로 가질 수있는 것처럼 – 이 플랫폼에 개발자가 있다는 것을 알고 있습니다 우리의 다른 견본과 이야기하십시오

오늘 내가 말할 모든 샘플, 그들은 열려있다 YouTube API 샘플에 따라 제공됩니다 그래서 한 가지를 놓치거나 둘, 흥분하지 마라 그들은 모두 오픈 소스입니다 거기에 가서 여전히 액세스 할 수 있습니다

그리고 오늘 저는 Java 샘플에 대해서 이야기 할 것입니다 그러나 우리는 파이썬에서 모든 클라이언트 라이브러리를 지원합니다 PHPnet에서 Objective-C로, 많은 사람들이 그리고 우리가 지원하는 다른 클라이언트 라이브러리를 볼 수 있습니다

그리고 그것은 완전히 RESTful 한 API입니다 클라이언트 라이브러리를 사용하지 않으려는 경우에도 REST API 만 사용할 수 있습니다 첫 번째 예를 들어 보겠습니다 방송을 만듭니다 오늘 저는 세 가지 일을하고 싶습니다

방송 제작을 시작한 다음 스트림을 만들고 함께 연결하십시오 그래서 나는 살아갈 준비가되어있는 어떤 것을 갖게 될 것입니다 브로드 캐스트 만들기를 시작합니다 메타 데이터를 입력 한 다음 상태를 설정합니다 그리고이 둘을 사용하여 브로드 캐스트 객체를 만듭니다

이제 YouTube에서이 방송 객체를 만들고 싶습니다 삽입 요청을 작성하고 실행합니다 그래서 나는 방송에서 시작하겠다 스 니펫, 메타 데이터 나는 그것을 설정하고 제목을 만들었습니다

나는 예정된 시간을 정했다 그리고 기억해야 할 한 가지는, 오늘은 필수 매개 변수 앞서 설명한 다른 매개 변수가 있지만 단지 최소한의 일을하는 것뿐입니다 그리고 두 번째는 지위였습니다 상태와 함께, 이것 때문에 예를 들어, 비공개로 설정했습니다

이전 버전을 사용하여 스 니펫과 상태를 설정 했으므로 브로드 캐스트 객체를 생성합니다 이제이 브로드 캐스트 객체를 YouTube에 삽입하려고합니다 그것은 YouTube에도 나타날 것입니다 그래서 그 삽입 요청을 만듭니다 그리고 클라이언트 라이브러리를 사용하여 라이브 방송을했습니다

요청을 삽입하고, 클래스를 삽입하십시오 그리고 만든 브로드 캐스트 객체를 래핑합니다 이 요청 앞부분 그리고 나는 그것을 실행했다 그리고 RESTful API라고 설명했습니다

모든 것이 클라이언트 라이브러리에 의해 성공적으로 수행되면 JSON이 전달되고 리턴 브로드 캐스트가 표시됩니다 방송은 실제로 YouTube 내부에 삽입되었습니다 그래서 그때부터, 내가 한 모든 일을 확인할 수 있습니다 성공 여부 따라서 방송을 만든 후 두 번째 단계는 스트림

그 시내는 – 나는 비슷한 나무를 할 것이다 메타 데이터부터 시작하겠습니다 내 섭취 설정을 지정합니다 그리고 스트림 객체를 생성합니다 마지막에는 YouTube에 삽입하겠습니다

그래서 스 니펫으로 시작합니다 메타 데이터이기 때문에 제목을 설정합니다 그런 다음 섭취 설정을 살펴 보겠습니다 처리 설정에서 내가 설명했듯이 지금 RTMP를 지원하십시오 이 예제를 위해 1080p로 설정했습니다

이것이 제가 지원하고자하는 최대 해상도입니다 지금 스트림 객체를 생성하고 스 니펫 및 방금 만든 섭취 설정 이제 YouTube에 삽입 할 차례입니다 그래서 다시 삽입 개체를 만듭니다 이번에는 라이브 스트림 삽입 객체입니다 그리고 나는 그 안에 물줄기를 담았다

일단 내가 그것을 실행하면, 나는 창조 된 시내가이다 돌려 보낸다 YouTube에서 기억해야 할 것이 있습니다 앞에서 설명했듯이, 이것은 여러분의 진입 점입니다 YouTube의 스트림 엔트리 포인트 따라서 일단이 스트림을 만들면 실제로 처리 주소, RTMP URL 가져 오기 및 스트림 명 따라서 동일한 API를 사용하여 실제로이를 해결합니다

처리 주소, 스트림 이름, 그래서 우리는 어디에서 알 수 있습니까? 스팀, 어디로 우리의 깃발을 보낼 수 있습니다 그래서 우리도 스트림을 만듭니다 지금까지 우리는 이벤트를 만들고 스트림을 만들었습니다 무언가가 빠졌어 나는 그것이 연결이라고 생각한다

그래서 우리는이 사건 안에서 시내가 일어나도록하고 싶습니다 따라서 우리는 바인드 요청을 생성 할 것입니다 내부에 브로드 캐스트 ID를 설정합니다 설정된 스트림 ID를 설정합니다 일단 실행하면 성공하면 방송

이제 바인딩이 성공했는지 여부를 확인할 수 있습니다 그래서 이것은 자바 샘플 이었지만, 나는 그것을 실행하고 싶다 컴퓨터에서 YouTube로 연결된다는 것을 알게됩니다 그래서 방금 전에 보여준 예제를 사용하고 있습니다 브로드 캐스트 예제

나는 그것을 실행할 것이다 OAuth 20 메소드를 사용하여이 작업을 수행합니다 스트림 만들기,이 예제, 내 스트림을 만듭니다 내 대신에 그래서 나는 접근을 허용 할 것이다

액세스가 허용되면 데모를 사용하기 시작합니다 따라서 "I / O"라는 제목의 스트림 브로드 캐스트 이벤트 '13 이벤트 "확인 그래서 나는 사건이 일어난 것을 봅니다 방금 게시되었습니다

나는 실제적인 시내를 창조 할 것이다 그래서 저는 스트림을 만들뿐입니다 이전에 설명했듯이 일단 스트림을 만들면 처리 주소가 있습니다 그리고 내 스트림 이름 – 내 고유 한 스트림 이름이 있습니다 그래서이 두 가지를 사용하여 데이터를 어디에 스트리밍할지 알 수 있습니다

그리고 마지막으로, 내가 설명했듯이, 이제 나는 그들을 하나로 묶는다 따라서 내가 만든 브로드 캐스트 ID와 내가 만든 스트림 ID는 내 사건이 알 수 있도록 그들을 묶어 라 방송 할 스트림 한 단계 아래로 가서 YouTube 웹 사이트로 이동하십시오 내 계정에서 라이브를 사용할 수 있으므로 내 계정에 있습니다

그래서 나는 여기서 라이브 이벤트를 볼 수 있습니다 방금 만든 이벤트, "I / O '13 이벤트" 그리고 클릭하자 이번 행사 그리고 내가 설명했듯이 그것이 사적이라는 것을 알았습니다

그것은 미리 예정되어 있습니다 섭취 설정으로 이동합니다 그리고 방금 만든 이벤트 인 "I / O Stream 이벤트 "가 여기에 있습니다 방금 설명한대로 1080p입니다 그래서 이것은 자바의 데모였습니다

그리고 저는 한 단계 더 나아가고 싶습니다 그리고 내가 시도 할 작은 스트리밍 앱을 만들었습니다 여기에서 시내로 어디 보자 그래서 나는 처음부터 – 내가 이걸 돌려 보자

승인 먼저 로그인부터 시작하겠습니다 Google Play 계정 관리자를 사용합니다 그래서 여기에서 내 계정이 있습니다 나는 내 계좌를 고를 것이다

이제는 이벤트를 승인 할 것입니다 그리고 나는 나의 이벤트를 만들 것이다 그래서 지금 무슨 일이 일어나고 나는 이벤트를 만들었습니다 나만의 독특한 증기를 만든 다음, 나는 그들을 함께 연결한다 그리고 내가 라이브 이벤트에 참석했을 때, 나는 단지 그것들을 나열합니다

보시다시피, 전에 만들었던 "I / O '13" 저기에있다 방금 만든 동영상 중 라이브 스트리밍입니다 여기 이벤트 그래서 나는 이것을보고있다 그리고 나는 지금 스트리밍을 시작할 것이다

스트리밍을 시작한 것처럼 보입니다 YouTube 웹 사이트에서 살펴 보겠습니다 그리고 내 라이브 스트림 이벤트 나는 실제로 스트리밍으로 가서 무엇이 보이는지 보게 될 것이다 지금 당장 일어나고있어

네 내 스트리밍이 여기서 시작되었습니다 내 API에서 스트리밍을 시작하기 위해 이미 클릭했습니다 API에서 그래서 나는 이미 클릭 했으므로 클릭 할 필요가 없었습니다

나는 시내를 시작하도록 요청했다 그리고 지금 당장은 서버가 트랜스 코딩하고 있습니다 그리고 몇 초 만에 우리는 살게 될 것입니다 그래서 그것을 보자 나는 나의 사건에 나의 계정 등을 맞댄 갈 것이다

이번에는 클릭 만하면됩니다 그리고 내 사건이 시작됩니다 몇 초만 기다려주세요 SATYAJEET SALGAR : 몇 초주세요 오늘 데모 신이 호의적 인 것처럼 보입니다

우리는 네트워크를 비난 할 수 있습니까? 이브라힘 울루 카야 : 죄송합니다 SATYAJEET SALGAR : 우리는 네트워크를 비난 할 수 있습니까? IBRAHIM ULUKAYA : 네, 물론, 왜 안됩니까? SATYAJEET SALGAR : 왜 안돼? 괜찮아 몇 초만주세요 관객 : [INAUDIBLE]? 이브라힘 울루 카야 : 아닙니다 질문은 내가 I / O '13에 스트리밍하거나 이번 행사

실제로, 내가 방금 한 것처럼, 나는 실제로 라이브를하는 것처럼 보입니다 스트리밍 이벤트 I / O '13은 Java Eclipse에서 사용한 것입니다 그래서 오늘은 Eclipse를 보여 줬습니다 그러나 원하는 언어를 자유롭게 사용할 수 있습니다

뭐 무슨 일이 일어나고 있어요 그리고 그래, 우리는 살아있다 SATYAJEET SALGAR : 그래, 우리가 간다

[박수 갈채] SATYAJEET SALGAR : 우리는 청중을 끌어들이 야합니다 IBRAHIM ULUKAYA : 오디오를 보내고 싶지 않았습니다 오늘 그것이 저의 데모에 관한 것입니다 나는 당신이 그것을 창조하는 것이 쉬웠다는 것을 당신이보기를 원했습니다 라이브 이벤트 및 라이브

그리고 이제부터는 질문을 시작할 수 있습니다 SATYAJEET SALGAR : 우리는 질문을 기쁘게 생각합니다 이브라힘 울루 카야 : 질문이 있으시면, 마이크로폰 그리고 우리가 취할 것 인 것처럼 생생한 질문을합니다 중재자 링크의 질문 SATYAJEET SALGAR : 운영자 링크에 관한 유일한 질문 "이브라힘은 왜 그렇게 대단하니?" 그리고 나 내가 그렇게 부탁했다고 생각해

그래, 제발 관객 : 그래서 아주 좋습니다 iOS에서는 아마도 HLS를 프로토콜로 사용하고있을 것입니다 HTTP 라이브 스트리밍, 맞나요? SATYAJEET SALGAR : 예 IBRAHIM ULUKAYA : 우리는 RTMP를 사용하고 있습니다

관객 : 이제 안드로이드에서 안드로이드는 훨씬 더 많은 것을 가지고 있습니다 실행의 고문 된 역사 멀티미디어 프로토콜 SATYAJEET SALGAR : 죄송합니다 네가 여기서 말한 것을 놓쳤다 관객 : 안드로이드에서

Android의 경우 HLS를 사용하고 있습니까? Chrome 브라우저가 표시되거나 다른 브라우저를 사용 중입니다 프로토콜을 Android로 스트리밍하려면 어떻게해야합니까? IBRAHIM ULUKAYA : 문제는 우리가 HLS 또는 다른 프로토콜 관객 : 안드로이드에서 IBRAHIM ULUKAYA : Android의 경우 실제로 사용하고 있습니다 지금 RTMP

SATYAJEET SALGAR : 당신은 재생 또는 제작자 측의 스트리밍 청중 : 재생 SATYAJEET SALGAR : 재생 재생, HLS 관객 : 안드로이드에 HLS? SATYAJEET SALGAR : 그렇게 믿습니다 재렉? 네

JAREK WILKIEWICZ : 예 내 생각에 그것은 안드로이드 버전까지입니다 그래서 우리는 [INAUDIBLE] 코드 변환을합니다 이브라힘 울루 카야 : 죄송합니다 SATYAJEET SALGAR : 오, 미안

JAREK WILKIEWICZ :이 플랫폼의 핵심 기능 중 하나는 다양한 형식으로 트랜스 코딩합니다 [알아들을 수 없는] SATYAJEET SALGAR : 예, 일어나요 오, 그런데 대답은, 대부분의 사람들은 그렇지 않았습니다 그것을 듣고, 우리는 다양한 포맷으로 코드 변환 했습니까? 대부분의 안드로이드 버전에서는 HLS입니다

일부에서는 다른 것입니다 네 고객 : API는 누구에게나 공개되어 있으며 일부는 공개되어 있습니까? 조직? SATYAJEET SALGAR : API는 누구에게나 열려 있습니다 관객 : 누구? SATYAJEET SALGAR : 공개되어 있고, 예, 공개되어 현재 열리고 있습니다 관객 : 네

따라서 누군가에게 모바일 앱을 만들어 로그인해야하는 경우 그들에게 [INAUDIBLE]을 허락하는 그들의 계좌? SATYAJEET SALGAR : 그렇습니다 그래서 누구나 개발할 수 있습니다 라이브 API를 사용합니다 우리가 지금 가지고있는 제약은 최소한 1,000 가입자가 귀하의 계정으로 스트리밍 할 수 있습니다 그것은 우리가 작업하고있는 것입니다

우리는 실시간 액세스를 확대하기 위해 노력하고 있습니다 그러나 지금 제약 조건은 자신의 계정 당신은 스트리밍을 통해 특정 수의 YouTube 계정으로 양호한 상태를 유지해야합니다 관객 : 좋아, 그럼 그게 내 다음 질문이야 그렇다면 API를 사용하기위한 한계는 무엇입니까? SATYAJEET SALGAR : 죄송합니다 관객 : API를 사용하기위한 한계는 무엇입니까? SATYAJEET SALGAR : 누구나 API를 사용할 수 있습니다

따라서 YouTube에 실시간 스트리밍 할 수있는 도구를 개발중인 경우 API는 공개입니다 개발자 키 이외에는 없습니다 IBRAHIM ULUKAYA : 아니오, API는 선적 서류 비치 우리가 제약을받는 유일한 것은 채널로 스트리밍됩니다 따라서 테스트 채널이 있거나 하나의 채널을 사용하여 API를 사용하면 항상 API를 사용할 수 있습니다

그러나 일단 라이브 스티 밍을 시작하면 결국, 귀하가 귀하의 제품과 귀하의 제품을 개발할 때 준비가되면 제품을 사용할 사람들은 실제로 라이브를 보낼 채널 안으로 들어간다 관객 : 오, 알겠습니다 그들은 채널이 필요합니다 그러나 실시간 스트림의 콘텐츠를 어떻게 화면에 나타 냅니까? SATYAJEET SALGAR : 그렇다면 우리는 어떻게 컨텐츠를 관리합니까? 관객 : 예를 들어, 공개하지 말고 어떻게 감지합니까? 어떻게 그걸 막아? SATYAJEET SALGAR : 아하, 당신은 스팸 걱정이있어 관객 : 네

SATYAJEET SALGAR : 그래서 우리는 이것은 우리가 해낸 것입니다 YouTube에서 많은 시간과 노력을 들였습니다

YouTube의 콘텐츠를 보호하는 모든 메커니즘 동영상 일반은 실시간 스트림에도 적용됩니다 그래서 사람들은 시내에 깃발을 꽂을 수 있으며, 그것은 내려갑니다 콘텐츠 ID라는 도구가 있습니다 저작권을 침해하는 콘텐츠 라이브 스트림에 대해서도 실행됩니다

다른 건 없니? 괜찮아 수줍어하는 청중입니다 우리의 이야기를 듣고 대단히 감사합니다 온라인으로 청취 해 주셔서 감사합니다 이브라힘 울루 카야 : 고마워요

SATYAJEET SALGAR : 이브라힘과 나는 여기서 놀고있다 와서 질문 해보십시오 IBRAHIM ULUKAYA : 다른 질문이 있으시면 하루 종일 샌드 박스 영역에있을뿐만 아니라 다른 영역에도 있어야합니다 YouTube 전문가 그래서 언제든지 와서 다른 질문을 할 수 있습니다

우리는 모든 것을 후속 조치 할 것입니다 감사 SATYAJEET SALGAR : 고마워

Maps Live: New Features in the Google Maps Mobile APIs for Android and iOS

嗨 CHRIS BROADFOOT : 안녕하세요 나는 Chris Broadfoot입니다

저는 Chris Broadfoot입니다 Google지도 개발자 관계 팀에서, Google지도 개발자 관계 팀에서 일합니다 나는 Daniel Schramm입니다 Daniel Schramm : 저는 Daniel Schramm, Associate Product입니다 Google지도 모바일 API 프로젝트의 제품 관리자 조수로서 Google지도 모바일 API의 관리자입니다

얼마 전에 우리는 iOS 및 Android에서 CHRIS BROADFOOT에있었습니다 : 우리는 최근에 모바일에 대한 업데이트를 릴리스했습니다 iOS와 Android 모두에서 업데이트 된지도 API입니다 오늘 우리는 비디오에서 다니엘 SCHRAMM 이야기 :이 업데이 트는 세 가지 새로운 기능을 소개합니다 이번 업데이트에서 우리가 오늘의 비디오에서 이야기하고자하는 세 가지 새로운 기능 – 패딩 마커 매핑 회전 및 플랫 마커는 패딩, 마커 회전 및 플랫 마커를 매핑합니다 먼저, 맵 패딩 (Map Padding)에 대해 살펴 보겠습니다 CHRIS BROADFOOT : 먼저 맵 패딩에 대해 설명하겠습니다

지도 채우기를 사용하면 기본 작업을지도로 옮길 수 있습니다지도 채우기를 사용하면 기본 Google지도를 오프셋 할 수 있습니다 동시에지도 외부에서 오버레이 컨트롤을 추가하여 추가 할 수 있습니다 예를 들어 반투명 메뉴 막대 또는 세로 막대와 같이 투명 메뉴 막대 또는 세로 막대 오버레이를 추가 할 수 있습니다 지도 채우기의 값은 언제든지 변경하거나 애니메이션으로 변경할 수 있습니다 예를 들어지도에서 사이드 바가 표시되거나 사라지는 경우 (예 :지도에서 사이드 바를 밀거나 내릴 때) 지도는 각 방향의지도 패딩 값을 고려하며지도를 다시 중심에 배치하는 것과 같은 카메라 업데이트는 안쪽 여백을 고려하여 마커의 위치를지도의 중앙에 위치 시키면 아무 것도 할 필요가 없습니다

오프셋에 대한 수동 계산의 번거 로움을 제거합니다 다음에 우리가 이야기하려고하는 것은 대니얼 SCHRAMM입니다 : 우리가 이야기하고 싶은 다음 미래 평면 마커는 평면 마커입니다 보는 방향에 관계없이 새로운 유형의 디자인입니다 평면 마커는 항상 평면으로 유지되는 새로운 유형의 마커입니다 카메라 배치 방식에 관계없이지도에 항상 배치됩니다 다른 마커와는 다른 표준 마커와는 다릅니다

지도를 회전하면지도에 제목이 표시 될 때 평면 마크가 항상지도에서 튀어 나오게됩니다 두 가지 유형의 마커를 사용할 수 있습니다 이제 평면 마커와 표준 마커를 모두 회전시킬 수 있습니다 앵커 포인트는 앵커 포인트를 중심으로 회전합니다 그래서 재미있는 평면 마커를 만들 수 있습니다 이렇게하면 평면 마커를 만들 수 있습니다

예를 들어, 나침반처럼 나침반처럼지도에 고정시킬 수 있습니다이지도는 항상지도에 고정되며, 항상 특정 방향의 한 방향을 가리 킵니다 위의 두 점을 CHRIS BROADFOOT와 결합하십시오이 두 특징은 다음과 결합 할 수 있습니다 멋진 사용자 경험을 통해 정말 매력적인 경험을 얻을 수 있습니다

예를 들어 GPS 경로를 재생 중입니다 예를 들어 GPS 경로를 재생 중입니다 마크는 사용자의 실시간 위치 및 방향을 나타냅니다 마커의 방위는 사용자의 방위를 나타냅니다 그리고 그 특정 시점에, 마커가지도를 따라 움직일 때 움직일 수 있습니다 DANIEL SCHRAMM의 크로스 플랫폼 기능 중 일부는 다음과 같습니다

이는 크로스 플랫폼 기능입니다 오늘 우리는 그것에 대해 이야기 할 것이고, 오늘 이야기 할 시간이 있습니다 플랫폼의 각 기능, 플랫폼 별 기능을 배우려면 릴리스 정보를 참조하십시오 설명서에 게시 된 설명서를 살펴보십시오 Google Maps API를 설치하는 것을 잊지 마십시오

CHRIS BROADFOOT : Google+ 서클의 Google지도 API + 페이지에 추가합니다 지켜 줘서 고마워요 들어 주셔서 감사합니다 다음에 다시 보겠습니다 DANIEL SCHRAMM : 너 보자

Shortcuts: Kick-start Google Maps Android API v2 Development

안녕하세요, 저는 Chris Broadfoot입니다 이번 주 Google지도 개발자 바로 가기에 오신 것을 환영합니다

Google을 시작하는 방법을 알려 드리겠습니다 5 분 안에 Android API를 매핑합니다 나는 방금 Android를 매핑하는 방법이라는 프로젝트를 발표했습니다 githubcom/googlemaps에 있습니다

가서 저장소를 확인하십시오 원하는 경우 포크를 사용할 수 있습니다 더 쉬운 경우 zip 파일을 다운로드하십시오 모두 좋다 여기 아래로 스크롤하면 다음과 같은 지침이 표시됩니다

자세한 세부 사항 그러나이 비디오를 따라 가십시오 따라서 디렉토리에 들어가면 모든 파일이 체크 아웃됩니다 이제 Eclipse, IntelliJ 또는 Ant를 사용할 수 있습니다 괜찮아요

먼저 가져 오기 방법을 보여 드리겠습니다 프로젝트를 Eclipse로 가져온다 나는 확실히 새로운 작업 공간을 사용하려고합니다 모든 것이 깨끗하고 우리가 가서 가져올거야 그곳에 프로젝트가 있고, 헬락 맵을 운영하십시오

따라서 파일, 가져 오기, 기존 Android를 가져오고 싶습니다 디렉토리를 선택하고 열기를 누른 다음 이 두 확인란을 모두 클릭하고 마침을 누릅니다 그게 뭔지는 잘 모르겠지만 여전히 효과가있을 것 같습니다 Perspective를 닫고 Java Perspective를 다시 열면, 모든 파일을 볼 수 있습니다 저거 닫아

여기에서 가장 중요한 파일은 바로 Androidmanifestxml 이제 API 키를 여기에 추가해야합니다 잠시 후에 그 방법을 알려 드리겠습니다 IntelliJ로 가져 오는 방법을 빠르게 보여 드리겠습니다

홈 화면에서 프로젝트 열기를 누르거나 파일, 프로젝트 열기 다시 한 번 프로젝트로 이동하십시오 선택을 누릅니다 그것은 열릴 것입니다 이제 가장 먼저해야 할 일은 Android SDK를 프로젝트 정의에 추가합니다

따라서 파일, 프로젝트 구조 및 여기에서 Android SDK를 선택하십시오 자, 만약 당신이 이미 그들을 가지고 있지 않다면, 당신은 New, Android SDK 모든 것을 설정하십시오 그건 매우 쉬워요 확인을 누릅니다

프로젝트에 들어가면 모든 파일을 다시 볼 수 있습니다 Androidmanifestxml, 매우 중요합니다 이제 프로젝트를 실행하기 위해 편집으로 이동해야합니다 구성

플러스 기호, Android 애플리케이션을 누르고 hellomap 모듈 우리는 USB 장치가 필요합니다 Android지도 애플리케이션을 실행하기 위해 에뮬레이터를 사용할 수 없습니다 계속해서 확인을 누릅니다 모듈, hellomap 모듈을 잊어 버렸습니다

확인을 누르고 전화가 연결되어 있고 잠금이 해제되어 있는지 확인하십시오 이제 Google API 콘솔로 이동하십시오 새 프로젝트를 만들고 Android를 활성화해야합니다 거기 API, 안드로이드지도 API API 액세스로 이동하고 새로운 Android 키를 만듭니다

디버그 키 저장소를 얻는 방법에 대한 지침이 있습니다 여기에 인증서가 있으면 당신은 comexamplehellomap 패키지를 사용하고있다 이제 열쇠를 가지고 안드로이드에 넣으세요

Eclipse 또는 IntelliJ에서 Run을 누르십시오 Ant가 작동합니다 좋아 그리고 휴대 전화로지도를 볼 수 있습니다 즉, Android지도 개발 경험을 즐기고, 다음에 또 보자

DevBytes: Bluetooth Low Energy API in Android 4.3

[음악 재생] 안녕하세요 내 이름은 Fred Chung, Android 개발자 관계의 일부입니다

오늘 우리는 Bluetooth Low Energy에 대해 이야기 할 것입니다 안드로이드 43에서, 우리는 내장 된 플랫폼 지원을 추가하고 있습니다 Bluetooth LE 새로운 Nexus 7과 Nexus 4는 처음 두 개의 Nexus입니다

Bluetooth 스마트 준비가 될 장치, 그들은 많은 블루투스 스마트와 통신 할 수 있습니다 오늘 시장에 주변 장치 오늘 샘플 애플리케이션 연습을 할 예정입니다 하지만 그 일을하기 전에, 블루투스 저에너지의 기술적 개념 API 객체를 이해할 수 있습니다 그 이름에서 알 수 있듯이, Bluetooth Low Energy는 블루투스 클래식에 비해

블루투스 저에너지 디바이스를 사용하는 것은 드문 일이 아닙니다 몇 년이 아니라도 지난 몇 주 동안 지속될 필요가 있기 전에 배터리를 충전하거나 교체하십시오 프로토콜 자체는 작은 버스트에 최적화되어 있습니다 데이터 교환은 다음과 같은 애플리케이션에 이상적입니다 센서, 리모컨 등등

반대로 블루투스 클래식은 오디오 스트리밍과 같은 고 대역폭 애플리케이션 이제 정보가 어떻게 구조화되는지 살펴 보겠습니다 BLE 응용 프로그램 BLE는 일반이라는 사양을 기반으로합니다 속성 프로파일 또는 GATT는 송수신을 제어합니다 속성으로 알려진 짧은 데이터 조각

Android 앱은 GATT 클라이언트 또는 GATT 서버 일 수 있습니다 응용 프로그램에 따라 다릅니다 GATT 서버는 서비스 콜렉션을 지원할 수 있습니다 서비스는 다음과 같은 다양한 기능으로 생각할 수 있습니다 장치

각 서비스는 UUID로 고유하게 식별됩니다 응용 프로그램에서 참조 할 수 있습니다 각 서비스 아래에 읽고 쓸 수있는 특성 BTLE 프로파일에 따른 작업 너는 함께 일하고있다 관점을 설정하려면 마음을 살펴 봅시다 속도 측정 프로파일 중 하나 인 표준 프로파일

심박수 센서는 GATT 서버입니다 이 다이어그램의 Android 앱은 GATT 클라이언트입니다 심박 센서 장치에서 호스팅되는 GATT 서버 여러 가지 서비스를 제공합니다 이 서비스 아래에는 GATT 컬렉션이 있습니다 형질

심장 박동 측정을 제공하는 장치가 있습니다 그 사실을 알리는 알림을받을 수 있습니다 당신이 읽을 수있는 센서의 위치 이제 Bluetooth Low에 대한 기본적인 이해가되었습니다 에너지 기술, 일부 코드를 살펴 보겠습니다

먼저 Android 매니페스트를 살펴 보겠습니다 androidhardwarebluetoothle이라는 새로운 기능이 있습니다 응용 프로그램이 작동하는 경우에만 선언합니다

해당 기능이있는 장치 응용 프로그램이 다음에서 작동하는 경우 생략 할 수 있습니다 장치가 없으므로 선택적으로 블루투스 저에너지를 디스 에이블한다 앱 내 기능 이제 디버깅 세션이 시작되었습니다 계속해서 스캔을 클릭하겠습니다

그래서 여기에 몇 가지 중점을 두었습니다 그것이하려고하는 것은 startLeScan 메소드 호출 API 문서에서 볼 수 있듯이 BLE 조작 메소드는 본질적으로 비동기입니다 당신은 콜백을 지정해야합니다 이벤트가 발생합니다

이 경우, 장치가 검색되면, 콜백 메소드가 호출됩니다 그래서 저는이 중단 점을지나 가게 할 것입니다 앱에서 볼 수 있듯이 몇 가지 장치를 찾으십시오 이제 심장 박동 센서를 클릭하십시오 테스트 할 테스트 키트에 해당합니다

그러니 계속 클릭하십시오 이제는 당신을 다른 활동으로 인도합니다 배경 서비스 그리고 서비스에 중단 점을 넣었습니다 그것이하려고하는 것은 GATT 서버에 연결하는 것입니다

이 메소드를 호출하여이 장치에서 호스팅되는 connectGatt 앞의 예와 마찬가지로 모든 API가 BLE가 본질적으로 비동기 인 것과 관련이 있습니다 여기에 또 다른 콜백을 전달해야합니다 이제 GATT 서버에 연결 했으므로 tryServices 메소드를 호출하려면 이용 가능한 GATT 서비스를 발견한다 이 기기에서 호스팅됩니다

이제 브레이크 포인트를 해제하십시오 이제 발견 된 서비스에 대한 콜백은 다음과 같습니다 호출되었습니다 즉, 앱이 장치에서 사용할 수 있습니다 앱이 컬렉션을 통해 반복 할 것입니다

서비스가 발견되어 UI에 표시됩니다 이것은 심박수 센서이므로, 우리는 심박수 측정 계속해서 심박수 서비스를 찾고 확장하고, 심박수 측정 특성을 볼 수 있습니다 계속해서 클릭하십시오 그것이 일어나는 이유는 그것이 특성 알림을 지원하면 공고

이제이 중단 점을 풀어 봅시다 이제 심장 박동수가 업데이트되기 시작하자마자 독서, 당신은 특성에이 콜백을 얻을거야 귀하가 통지를 받고 있음을 나타내는 변경 그래서 우리는 중단 점을 발표 할 것입니다 여기 화면에서 볼 수 있듯이 우리는 마음을 얻고 있습니다 매우 작은 텍스트로 측정 값 판독 값을 표시합니다

나는 당신이 그것을 볼 수 있는지 모른다 심장 박동수 측정 알림으로 업데이트 중입니다 주변 장치로부터 수신 자, 저는 매우 중요한 요점을 설명하고자합니다 그리고 그것은 여러분이 특정한 주변기기와의 Bluetooth LE 연결은 스택이 할 수 있도록이 close 메소드를 호출하십시오

깨끗하게 정리하고있어 이것은 연습을위한 것입니다 자세한 내용을 보려면 Bluetooth Low를 확인하십시오 dandroid

com의 에너지 개발자 가이드 시청 해주셔서 감사합니다

YouTube Developers Live: YouTube Direct Lite for Android

이브라힘 울루 카야 : 안녕하세요 저는 YouTube API 개발자 인 Ibrahim Ulukaya입니다

관계 팀 And Android API Developer의 Roman Nurik과 함께하십시오 관계 팀 안녕, 얘들 아 어떻게되고 있습니까? IBRAHIM ULUKAYA : 그리고 오늘 여러분들이 이미 알아 낸 것처럼, 우리는 Android와의 YouTube API 통합에 대해 이야기 할 것입니다

그래서 그것은 안드로이드 앱과 같을 것입니다 YouTube에서 제공하는 YouTube Direct Lite Android 앱을 열면됩니다 우리는 디자인 원칙에 대해 이야기 할 것입니다 YouTube API와 YouTube API를 YouTube Direct Lite 어쩌면 시작하자

YouTube Direct Lite 란 무엇입니까? 너희들이 항상 Stack Overflow에서 묻는 동안, 내가 실제로 다른 사람들에게서 비디오를 얻을 수있는 방법에 대해 다른 사람들이 내 계정에 동영상을 업로드하도록 허용하려면 어떻게해야합니까? 사실, 프라이버시 문제 때문에 우리는 실제로 원하지 않습니다 귀하는 귀하의 비밀번호를 공유하거나 YouTube 계정을 공유 할 수 있습니다 모두가 내 YouTube 채널에 업로드하도록하십시오 따라서 YouTube Direct Lite를 만들었습니다

YouTube Direct Lite는 사람들이 자신의 채널에 대한 알림을 보냅니다 재생 목록을 조정하면 해당 재생 목록을 검토 할 수 있습니다 원하는 비디오를 승인 할 수 있습니다 재생 목록에 있어야합니다 따라서 업로드 한 후에는 실제로 보류 중이며 검토 재생 목록을 만들고 원하는 모든 비디오를 승인합니다

그리고 그들은 실제로 진짜 재생 목록에와 있습니다 세상을 보여주고 싶다 이렇게하면, 당신은 첫 번째 [INAUDIBLE] 검토 전에 공개합니다 이 경우 모바일 앱을 만들고 싶습니다 이렇게하면 YouTube Direct Lite로 시작했습니다

Android 프로젝트 프로젝트와는 별도로, 우리는 실제로 최상의 YouTube API 사용 사례 수집 YouTube Android 디자인 사례를 통해 사람들이 참조 프로젝트 이 프로젝트는 모두 GitHub에서 오픈 소스로 제공됩니다 github / youtube / ytd-android 그리고 여러분, 자유롭게 기부 해주십시오 그것을 사용자 정의하고 자신의 유스 케이스에 사용하십시오

사용 사례가 그렇듯이 팬에게 웹 사이트 또는 서비스 용 비디오를 업로드하십시오 그런 다음 YouTube 경쟁을 만들고 사람들이 최고의 동영상을 업로드합니다 그리고 그것을 검토하고 사이트에 표시 할 수 있습니다 시작하자, 어쩌면 우리가 화면을 볼 수 있다면, 나는 단지 약간의 데모를 보여줄 것입니다

첫 번째 메뉴에는 실제로 YouTube가 있습니다 입증 실제로 YouTube와 YouTube를 모두 관리 할 것을 요청합니다 내 Google+ 계정뿐 아니라 실제로 어떤 API를 사용하고 있는지 왜 우리가 그들을 사용하고 있습니다 그리고 그것을 시작으로, 권한 부여에 대한 실제 증거 OAuth 2

0 흐름입니다 그리고 우리가 승인 받았음을 확인하면 내 모든 동영상, 이전 동영상 및 [재미 있지 않은] 내부의 재미있는 비디오처럼 여기에는 세 가지 기본 옵션이 있습니다 하나의 옵션은, 나는 YouTube 동영상은 여기에 있습니다 나는 그것들 중 하나를 선택할 수있다

나는 그들을 놀게 할 수있다 그리고 일단 그들이 실제로 연주되면 – 그 비디오를 실제로 보여주고 싶습니다 나를 참아주십시오 여기 느린 인터넷이 있습니다 실제로 YouTube에 보낼 수 있습니다

그래 비디오가 이미 재생되기 시작했습니다 그리고 나서 실제로 그 재생 목록을 보냅니다 제출할 수 있습니다 동영상이 이미 해당 재생 목록에 제출되었습니다

제출하고 싶습니다 저는 사실이 파일에서 상수 파일을 만들었습니다 그래서 당신은 실제로, 빨리, 당신의 [INAUDIBLE] 파일 목록 보내려는 재생 목록 ID를 구울 수 있습니다 모든 제출물은 해당 재생 목록으로 이동합니다

두 번째 것은 실제로 미리 녹화 된 비디오 우리는 비디오가 있습니다 ROMAN NURIK : 내 자신의 많은 비디오 이브라힘 울루 카야 : 오, 알겠습니다 큰

그리고 그 업로드를 사용하십시오 실제로 이미 업로드가 시작되었으며 실제로 프로세스를 추적합니다 더 긴 비디오가 있다면 더 나은 진행 또는 세 번째 옵션으로 비디오 녹화를 시작할 수도 있습니다 기스로부터

우리는 멋진 비디오를 가질 수 있으며 아마도 네 와우! 이브라힘 울루 카야 : 예, 우리 같은 것을 보여줍니다

그리고 아마도 카메라는 다른 것이 아니었을 것입니다 그래서 저는 안드로이드 카메라도 그리고 나는 [부적절한] 그것을 [INAUDIBLE] 엘리먼트로 보자 진행률 표시 줄이 실제 작동합니다 우리는 좀 더 긴 비디오를 녹화 할 것입니다

설명하기에는 [INAUDIBLE]을 사용합니다 세 가지 유스 케이스가 있습니다 첫 번째로, 이미 업로드 한 파일 중 하나를 제출할 수 있습니다 YouTube 동영상을 제출합니다 새 비디오를 녹화 할 수있을뿐 아니라 Android 기기에서 녹화 한 동영상 그리고 그들은 모두 YouTube로 보내질 것입니다

따라서이를 사용하여 YouTube 업로드 또는 추가 태그를 추가하여 YouTube Direct Lite 어떤 재생 목록이 실제로 동영상을 보낼지를 안다 나는 그것이 1 분이면 충분하다고 생각한다 네 이 비디오를 보내 봅시다 그리고 우리는 항상 비디오를 보여줄 수 있습니다

그리고 당신은 이미 시작했습니다 보시다시피 여기에 알림 바가 있습니다 시작이 완료되었다는 것입니다 진행 상황을 보여줍니다 그리고 그것이 완료되면, 우리는 실제로 볼 수있게 될 것입니다

또 다른 알림으로, 동영상은 이미 처리가 완료되면 우리는 동영상이 준비되었습니다 가서 비디오를 볼 수 있습니다 이제 내 계정의 동영상 관리자가되었습니다 실제로 YTDL에서 거부 한 YTDL 제출물과 내 동영상을 보내고 싶은 나의 실제 재생 목록 3 개의 동영상이 있으므로 이전에 공유 한 내 동영상입니다

실제로 절제 도구로 이동합니다 내 평가는 AppSpot, ytdirectliteapp에서 호스팅됩니다 spotcom/static-min/admin

html 거기에서, 나는 실제로 – 이미 내 계정으로 로그인했습니다 그리고 나는 나의 플레이리스트를 본다 그리고 제가 실제로 갈 때 저는 실제로이 세 가지를 봅니다 이미 승인 된 동영상과 내가 방금 제출 한 동영상이 보류 중입니다

그래서 내가 실제로해야 할 일은 비디오를 승인하는 것뿐입니다 그리고 일단 그들이 그것을 승인하면, 우리가 실제로 "성공"에 가면 내 재생 목록에 이미있는 비디오를 볼 수 있습니다 그리고 내가 여기 내 오래된 비디오로 돌아 가면, 내 재생 목록에, 나는 이미 내 재생 목록에 업로드되어 있는지 확인하십시오 YouTube Direct Lite 앱과 같았습니다

그리고 말하자면, 저는 로마 누릭 (Roman Nurik)에게 여기로 물어 봅니다 우리가 사용한 디자인 원리에 대해 이야기하기 이 앱은 진짜 같았습니다 [INAUDIBLE] 처음에 나는 그것을 로마에 가져 가고, 로마는 나를 많이 도와 주었다

그리고 그가 말하는 것을 보자 ROMAN NURIK : 좋아, 그럼 디자인에 대해 조금 이야기 해보자 이 앱의 그래서 제가 여기에서 이야기하고 싶은 몇 가지가 있습니다 첫 번째는이 앱의 가장 중요한 부분이 하나의 기본 일반 흐름이 있다는 것입니다 어떤 종류의 비디오 콘텐츠가 있거나 녹화하고 싶습니다

그 비디오 내용 그리고 나서 당신은 그것을 준비의 종류로 가져 가고 싶습니다 미리보기 영역 그런 다음 해당 동영상을 업로드하려고합니다 당신은 선택했거나 취했습니다

그리고 거기에서, 기본적으로 – 모든 추가 상호 작용은 상태 표시 줄을 통해 진행됩니다 공고 그래서 당신이 이것을 할 수있는 몇 가지 방법이 있습니다 주목할 첫 번째 사실은 실제로 비디오를 섭취하는 다른 방법 기존 YouTube 동영상 중에서 선택할 수 있습니다

귀하의 계정에 기본적으로 갤러리에서 항목을 선택할 수 있습니다 이전에 녹음 한 것, 전화, 어디서나 업로드하지 않고 또는 즉석에서 녹화 할 수 있습니다 그래서이 응용 프로그램의 원래 버전에서, 나는 당신이 2 개 또는 3 개의 큰 버튼이 있습니다 그리고 그 버튼들은 비디오 선택이나 선택이었습니다

갤러리 또는 레코드에서 그래서 즉시 사용자를 던지는 문제 3 개의 큰 버튼이있는 곳으로 그런 다음 즉시 결정을 내려야합니다 매우 정적 디자인의 관점에서 볼 때 매우 어렵습니다 기본적인 시각을 손상시키지 않으면 서 정말 멋지게 보입니다

공백의 사용과 같은 디자인 원칙 그런 것들 그래서 우리가하기로 결정한 것들 중 하나는 가장 일반적이거나 잠재적으로 가장 일반적인 형태의 입력, 하나 섭취 기술의 가장 일반적인 형태의 그 즉시 사용할 수있는 바로 그 앱을 엽니 다 앱을 여는 즉시 귀하의 목록을 볼 수 있습니다 기존 YouTube 업로드 그리고 그것은 기본적으로 당신의 최고의 종류입니다 섭취 옵션

네가 뭔가를 선택하고 싶지 않다면 이미 업로드했으면 기본적으로 아마도 어쩌면 20 %의 유스 케이스이거나 15 %의 유스 케이스 인 옵션 케이스, 또는 그런 것 당신은 그것들을 바닥에 추가 옵션으로 가지고 있습니다 또는 자신의 앱에서이 작업을 수행하려면 화면 오른쪽 상단의 작업으로 액션 바 그리고 이것에 대한 좋은 점은 섭취 기술을 선택하면 기본적으로 동일한 미리보기 흐름에 포함됩니다 같은 큰 미리보기를 얻었고 그 다음에는 버튼, YouTube Direct Lite에 업로드

그리고 거기에서 똑같은 일이 일어납니다 따라서 사용자에게 매우 즉각적입니다 무슨 일이야 그래서 우리가 여기서 한 두 가지 재미있는 것들이 있습니다 분명히, 변화에 추가, 전체 흐름 주변

첫째, 우리는 시각 자료와 함께 많은 시간을 보냈습니다 분명히 우리는 다음과 같은 흥미로운 것을 사용하고 있습니다 지형 우리는 여기서 Roboto Light를 사용하고 있습니다 우리는 Roboto Condensed를 두 영역에서 사용하고 있습니다

우리는 Roboto Condensed Bold All Caps를 사용하고 있습니다 이 버튼의 캡션 그리고 그것은 표준 Holo 디자인 미학의 일부를 따릅니다 다른 시스템 앱에서도 볼 수 있습니다 우리는 또한 반응이 빠른 디자인 기법을 사용하고 있습니다 따라서 실제로 Nexus 7에서 조금 더 좋아집니다

하지만이 화면과 Nexus의 차이점은 7, Nexus 4는 Nexus 7에서 사용하는 것으로, 2 열 그리드 또는이 경우 Nexus 10에서 2 열 그리드 아마 여기 네 칼럼처럼 더 많은 것을 할 수 있습니다 그리드 또는 뭔가 하지만 Nexus 4에서는 단일 열 목록입니다 그리고 그 도움이 일부 공백 문제를 완화하는 데 도움이 너는 덤벼들 것이다 예를 들어 Nexus에 목록을 방금 표시했다면 10 인치 가로로 보면, 물건이 매우, 매우 길고 믿을 수 없을만큼 이상한 종횡비

그래서 태블릿에서 멀티 칼럼 그리드를 사용합니다 좀 더 잘 반응하도록 도와 줄 수 있어요 디자인 된 앱 그 밖에서 우리는 또한 Android의 표준 측정 항목 따라서 표준 48dp 리듬과 16dp 여백이 있습니다 그래서이 경계선을 따라 거의 모든 곳에서 왼쪽 가장자리는 16dps입니다

전체 간격은 16 dps를 사용합니다 또는 8 dps 또는 4 dps 그것은 우리가 사용하는 표준 간격 모델의 종류입니다 그리고 도상학 그래서 원래, 우리는 매우 큰, 다채로운, 그라디언트 단추입니다

그리고 우리는 좀 더 조용하고 차분하고 평평한 스타일로 전환했습니다 아이콘 갤러리 아이콘이 매우 인상적입니다 표준 갤러리 아이콘 표준을 사용하여 매우 평평합니다

홀로 라이트 액션 바 스타일이라고 생각합니다 그리고 기록을 위해, 어떤 기록이 매우 자주 붉은 색과 관련된, 우리는 그것에게 줄 것을 결심했다 약간 다른 치료 디자인 측면에 대한 흥미로운 점은 사실,이 아이콘들에 대해서는 우리가 갈 필요가 없었습니다 포토샵이나 뭐든지

Android Asset Studio를 사용하고 일반 아이콘 생성기 우리는 클립 아트 집합에서 아이콘을 연결했습니다 원했고, 우리가 필요로하는 색을주고, 방금 내보냈습니다 그것들을 모든 다른 밀도에 맞 춥니 다 그래서이 많은 것, 우리는 정말로 어떤 종류의 것이 필요하지 않았습니다

특별한 포토샵 작업 우리는 XML 편집기에서 디자인을 수행했습니다 Android Studio의 레이아웃 편집기에서 사실 Eclipse에 있었습니까? 이브라힘 울루 카야 : 예, 이클립스에있었습니다 네 그래서 우리는 Eclipse ADT 플러그인에서 디자인을 수행 한 다음 모든 아이콘은 Android 자산 스튜디오에서 가져온 것입니다

전반적으로 디자인은 매우 간단합니다 우리는 우리가 가지고있는 많은 견고한 기술을 사용합니다 쉽게 이용할 수 있습니다 전반적으로 샘플 앱의 견고한 디자인입니다 이거 정말 좋다

IBRAHIM ULUKAYA : 사실, 플러스 디자인, 당신은 또한 몇 가지 안드로이드 기술 여기처럼, 당신은 실제로 NotificationCompat 그리고 그로부터 당신은 우리의 진보를 보여줄 수 있습니다 동영상 준비가 완료되었을 때뿐만 아니라 동영상을 볼 준비가되었습니다 클릭하면 비디오를 볼 수 있습니다

위에, 우리도 – 어쩌면 우리는 compat에 대해 이야기 할 수 있습니다 사실, 정말로 빨리, 우리는 이야기하고 싶었습니다 NotificationCompat에 관해서 그래서 YouTube 플레이어가 지원하는 API 수준을 잊어 버렸습니다 하지만 알림, 알림 기능이 있습니다

Android 41 이상에서만 사용할 수 있습니다 예를 들어, 추가 작업을 원하거나 귀하의 통지에 큰 이미지, 당신은 않을거야 새로운 API를 사용할 수 있습니다 그래서 우리는 NotificationCompat라고 불리는이 클래스를 가지고 있습니다 지원 라이브러리에 있습니다

기본적으로 어떤 새로운 API를 사용할 수 있습니다 Android 버전 그래서 여기, 통보를 위해, 나는 너를 믿는다 NotificationCompat 클래스를 사용했습니다 IBRAHIM ULUKAYA : 또한 NotificationCompat를 사용하여 분리 된 것

실제로 업로드를 시작하고 싶지 않을 때 업로드하여 앱을 방해합니다 따라서 사용자가 어디서든 앱을 사용하고 업로드, 사용자가 앱을 나가거나 닫는 경우 응용 프로그램, 난 정말 업로드 계속 싶어요 그래서 IntentService로 만듭니다 그래서 실제로 IntentService는 실제로 여기서 Compat를 사용합니다 그리고 이것을 사용하면 if보다 훨씬 더 가벼운 느낌을줍니다

그것은 기본적으로 별도의 스레드였습니다 전체 과정 진행 ROMAN NURIK : 예, IntentServices는 이 같은 IntentServices는 기본적으로 – 그래서 서비스는 단지 무언가입니다 백그라운드에서 실행됩니다

분명히 UI가 없습니다 그러나 서비스는 실제로 동일하게 실행됩니다 귀하의 UI로 스레드 따라서 스레딩에 아무 것도하지 않고 단순히 사용한다면 서비스, ​​그것은 실제로 같은 일을하고있을 것입니다 스레드를 UI로 사용하므로 UI가 중단 될 수 있습니다

IntentService는 실제로 매우 좋은 것입니다 기본적으로 스레드가 작업을 수행하는 것입니다 그리고 일이 끝나면 기본적으로 onHandleIntent 메서드가 완료되면 서비스, ​​그것은 스스로 멈추고 스레드를 죽인다 그래서 아주 좋은 방법입니다 실제로, 또한 대기열에 내장되어 있습니다

IntentService를 세 번 호출하면 첫 번째 작업을 수행하는 중입니다 실제로는 다른 두 개 대기열에 놓으면 나머지 두 명 끝내라 그것들이 끝나면, 그것은 스스로를 죽일 것입니다 그래서 정말 훌륭한 수업입니다 어떤 종류의 다운로드 또는 업로드, 그런 것들

아주 좋은 수업입니다 이브라힘 울루 카야 : 좋습니다 고마워, 로마 이제 실제로, 나는 또한 약간의 사용 된 YouTube API 및 YouTube 활용 방법 그래서 우리는 기본적으로 인증을 받았습니다 OAuth 2

0이었습니다 이를 위해 Google OAuth 인증 정보를 사용했습니다 정말 편리합니다 [INAUDIBLE] 그래야 거래 할 필요가 없습니다 토큰

새로 고칠 필요가 없습니다 또는 예외가있는 경우 예외가 모두 있습니다 덮어 씌우면 훨씬 더 쉽게 처리 할 수 ​​있습니다 그것이 [INAUDIBLE] 예외 인 경우 Google OAuth 자격증 명을위한 OAuth 2

0이 OAuth 20은 쉽게 사용할 수 있습니다 Play 서비스와 같은 예외가있을뿐만 아니라 사용할 수 없다면, 그것을 이해할 수있을 것입니다 또는 기록 가능한 예외처럼 뭔가가있는 경우 아마도 당신은 당신의 승인을 잃을 것입니다 실제로 있으면 [INAUDIBLE]을 (를) 팝업하십시오

표시 될 자체 승인 화면에서 당신은 아무런 실수없이 그것을 통과 할 수있을 것입니다 그것은 더 깨끗합니다 기본적으로 코드의 절반을 정리하는 데 실제로 도움이되었습니다 그것은 단지 인증 이었지만 정말 큰 문제였습니다 Google OAuth 계정을 사용하는 것이 좋습니다

그 자격 증명 또한 재개 가능한 업로드를 사용했습니다 재개 가능한 업로드는 실제로 데이터 API에 있습니다 당신은 한 장씩 업로드를합니다 업로드에 실패하면 [INAUDIBLE] 시도하여 가장 가까운 곳에서 업로드가 중단 된 위치부터 시작할 수 있습니다

끝까지 가버 리지 않고 끝까지 가야했다 처음부터 시작합니다 큰 파일을 업로드하는 경우 매우 유용합니다 그리고 작은 파일을 업로드하더라도 실제로는 정말 좋은 접근 방식을 업로드 할 수 있습니다 그리고 저는 실제로 정상적인 Java 재개 가능한 업로드를 그것을위한 자바 라이브러리, 그리고 그냥 안드로이드에 연결, 모든 것이 완벽하게 작동했습니다

업로드에서 우리는 실제로 끌어 오기 처리를 사용합니다 우리가 시작한 후에 실제로 Data API를 사용하고 있습니다 업로드, 우리가 소개 한 기하 급수적 인 백 오프와 함께, 우리는 계속 유지– 처리 상태를 당깁니다 그리고 일단 비디오가 준비되면, 우리는 당신이 할 수있는 것을 보여줍니다 이제 우리의 비디오를 시청하십시오

우리는 단지 다른 진행 상황 알림을 던집니다 NotificationCompat 우리는 여기에 많은 데이터 API를 사용합니다 실제로 업로드 재생 목록에서 자신의 동영상을 잡아 그리고 실제 업로드는 Data API입니다

실제 YouTube Direct Lite 제출은 기본적으로 [INAUDIBLE] 태그 추가, YouTube 재생 목록 추가 다이렉트 라이트 대쉬 재생 목록 ID, 태그의 종류 그래서 우리가 업로드하면, [INAUDIBLE]은 어느 재생 목록을 이해할 것입니다 당신은 그 비디오를 제출하고 싶습니다 그리고 그것은 Data API와 같았습니다 Google은 Google+ API를 조금만 사용하므로 Google+, 우리는 정말로 당신이 누구인지 알고 싶습니다

그리고 우리는 실제로 당신이 누군지 실제로 보여주고 싶습니다 실제로 우리가 당신을 이해한다는 것을 보여주고 싶습니다 우리는 당신이 누군지 알고 있으며, 실제로, 당신은 그것을 보낼 수있는 올바른 사용자입니다 다른 사람의 계정을 사용하고 있지 않습니다 이 과정에서 Google은 실제로 Google+에서 내 프로필 사진을 가져옵니다

너의 정체성 그리고 만약 당신이 데모로 돌아 간다면 조금 그리고 실제로 볼 수있는 데모에서는 Google+ 공유 버튼, Google +1 버튼 그리고 그렇게 [INAUDIBLE] 나는 실제로 여기에 갔다 그리고 그동안 나는 실제로 하나의 내가 전에 말했어야만했던 것

따라서 실제로 Google+를 클릭하면 실제로 공개적으로 버튼을 공유하십시오 아니면 그냥 취소 할 수 있습니다 그리고 Android [INAUDIBLE] 이전에 말한 것을 잊어 버렸고 Up 탐색 기능도 사용합니다 그래서 당신이 어떤 페이지에 있다면, 당신은 같은 것입니다 재검토, 돌아가고 싶다

항상 정상적인 뒤로 버튼을 사용하는 대신, 실제로 정말 멋진 업 내비게이션이 있습니다 그러면 홈 화면으로 이동합니다 이를 위해 네비게이션 트리를 만들면 실제 활동은 어떤 앱을 후진 시킬지를 안다 한 번 이상 너의 활동 – 네 그리고 실제로, 그것은 매우 어려웠습니다

Up을 구현합니다 글쎄,별로 어려운 것은 아니지만 많이 필요했습니다 Up을 올바르게 구현하려는 노력 하지만 이제 문자 그대로 몇 가지 추가 사항 만 있습니다 당신의 매니 페스트, 당신은 기본적으로 이것을 말할 수 있습니다

미리보기 활동 – 내가 부르는대로, 준비 구역의 종류 – 이 미리보기 활동, 그 부모 활동은 가정 활동입니다 그래서 안드로이드는 사용자가 위로를 누르면 버튼을 누르면, 기본적으로 그 매니페스트를 읽고 말합니다, 이봐, 나 가정 활동에 끌리기를 원한다 그리고 그것은 단지 당신을 위해 모든 것을 할 것입니다 과거에는 실제로 광고를 구현해야했습니다 onOptionsItemSelected 호출입니다

그리고 그것은 너무 많은 일이었습니다 그래서 우리는 그것을 매우 단순화했습니다 그리고 이것은 그것을 아주 많이 사용합니다 IBRAHIM ULUKAYA : 너무 기쁘다 나에게 5 분을 줬다

그리고 나는 그것을 정말로 즐겼다 또한 Android Player API를 사용하여 Play SDK에서 동영상을 만들면 그것을위한 완전히 새로운 UI보기 플레이어를 사용하기 만하면됩니다 그리고 플레이어의 [INAUDIBLE] 그것에 대한 모든 조치를 처리하는 방법 우리가 풀 스크린으로 갈 수있는 것처럼

그리고 우리는 [INAUDIBLE]의 비디오를 볼 수 있습니다 어디에서 그만 두었습니까? 그리고 돌아가서, [INAUDIBLE]은 그것으로부터의 무엇인가 ROMAN NURIK :이 미리보기 또는 준비 영역은 찍은 것과 같은 것들에 대한 비디오보기와 카메라 또는 갤러리, YouTube 플레이어 API를 당신이 선택한 어떤 것을위한 것입니다 그 격자는 처음에 IBRAHIM ULUKAYA : 예, 그래서 우리는 정말로 두 가지 모두에 대해 비슷한 인터페이스를 완성하십시오

그래서 당신은 이것이 실제로 두 번째 단계라는 것을 이해합니다 당신은 어느 단계에서 길을 잃지 않았습니다 당신은 정말로 당신이 사용할 수있는 주요 단계가 있다는 것을 알고 있습니다, 두 레코드 중 하나를 선택하고 기존 비디오 또는 재생할 수 있습니다 그리고 두 번째 단계에서, 당신은 그것을 승인합니다 그리고 그것은 주요 단계에오고, 그것은 당신이 업로드 중이거나, 이미 제출되었습니다

그리고 YouTube Direct Lite에 대한 모든 것이 었습니다 Android 앱 그리고 오늘 나에게 같이 온 것에 대해 고마워 네, 기꺼이 도와 드리겠습니다 IBRAHIM ULUKAYA : 그리고 우리는 항상 플러그를 꽂고 싶다고 생각합니다 개발자 관계 팀, YouTube와 Android 모두 전 세계 거의 모든 곳에서 채용되고 있습니다

로마 누리 크 : 항상 고용 이브라힘 울루 카야 : 우리는 항상 고용하고 있습니다 네가 우리와 함께하기를 희망한다 다시 생각 나게하기 위해 언제든지 신청할 수 있습니다 developer

googlecom/jobs는 물론 마음에 듭니다 오픈 소스 프로젝트는 githubcom/youtube입니다 YouTube 저장소 인 slash ytd dash android

그리고 [INAUDIBLE]에 가입 해 주셔서 감사합니다 뉴욕의 Ibrahim Ulukaya와 Roman Nurik 너를 만나

DevBytes: Android 4.4 Transitions

안녕하세요 저는 Chet Haase입니다

Android UI Toolkit 팀의 엔지니어입니다 오늘은 새로운 애니메이션에 대해 이야기하겠습니다 기능을 제공합니다 전환이라고합니다 전환을 사용한 아이디어는 실제로 많은 것들 뒤에있는 아이디어 우리가하는 일은 당신을 위해 일을 쉽게하려는 것입니다

안드로이드 응용 프로그램 개발자, 사용자에게보다 풍부한 경험을 제공하려면, 잘하면 적은 노력으로 전환, 그것은 단순한 생각입니다 기본적으로 다른 장면을 설명하는 방법입니다 애플리케이션에서 미리 레이아웃 리소스로 파일 또는 동적으로 변경 될 수 있습니다 변경 사항을 적용하여 변경 사항을 애니메이션으로 적용 할 수 있습니다

그러한 변화가 무엇인지 그리고 당신은 방해가되지 않고 방금 도망 갈 수 있습니다 화면 전환이 자동으로 실행되게하십시오 더 많이 관여 할 필요없이 이러한 수동 애니메이션을 실행하십시오 UI에서 애니메이션을 만드는 전형적인 모델입니다

바라건대, 하루가 끝날 때, 보다 풍부한 응용 프로그램 경험을 얻을 수 있습니다 직관적 인 방식으로 화면에서 더 많은 것들을 움직여서 사용자가 더 풍부한 경험을 얻을 수 있습니다 그리고 그들은 더 나은 이해를 얻습니다 응용 프로그램이 실제로 어떻게 작동하는지 너는 자연적으로 변화 할 수 있기 때문에 응용 프로그램의 서로 다른 장면 사이에서 그리고 세계에는 더 많은 애니메이션이 있습니다

나는 항상 그것을 좋아한다 승인 이제 슬라이드를 살펴 보겠습니다 그리고 API가 어떻게 작동하는지에 대한 간략한 개요를 살펴 보겠습니다 다른 부분은 뭐지? 제가 여기서 건너 뛰는 세부 사항이 많이 있습니다

그러나 당신은 무료이며 체크 아웃하는 것이 좋습니다 참조 문서의 상세 developerandroidcom에 대한 기사, 또한 나중에 조금씩 볼 수있는 API 데모를 제공합니다 우리는 그것의 일부 코드를 살펴볼 것입니다 승인

먼저 장면의 개념부터 시작합니다 당신은 이것을 레이아웃으로 생각할 수 있습니다 기본적으로 뷰 계층 구조입니다 이 특정 장면이 어떻게 생겼는지 설명합니다 이것은 전체 응용 프로그램의 장면 일 수 있습니다

특정 화면에서 또는 하위 계층 구조 일 수 있습니다 이 특별한 경우, 장면 우리가 텍스트보기, 편집 텍스트 및 단추가 있습니다 아주 간단합니다 그리고 우리는 또 다른 장면을 가지고 있습니다 다른 레이아웃 파일을 통해 설명 할 수 있습니다

거기에 다른 텍스트보기가 있습니다 조금 더 풍부 해졌습니다 텍스트, 거기에 더 자세한 내용 하지만 편집 텍스트 필드와 버튼이 있습니다 그리고 아마도 이것들은 공유 된 구성 요소입니다

어쩌면 그들은 위치를 옮겼을 수도 있고 크기를 바꿀 수도 있습니다 하지만 실제로는 두 장면에서 공유됩니다 사용자가 이해하도록 도울 수 있다면 좋지 않을까요? 애플리케이션에서 장면 1에서 장면 2로 이동하면, 사라지는 일들이 사라지면서 일어난 변화들, 그 안에있는 퇴색하는 것들이 존재하게되었고, 이 장면들 사이에서 공유 요소의 크기를 조정할 수 있습니까? 그것은 전환이 무엇에 관한 것입니다 이러한 서로 다른 장면을 지정합니다 그리고 나서 당신이 한 장면에 갈 때, 자동으로 애니메이션을 시작하고 필요한 애니메이션을 실행합니다

그 변화를 만들기 위해서뿐만 아니라 시간이 지남에 따라 변화를 애니메이션으로 나타낼 수 있습니다 그럼 장면을 살펴 봅시다 이들은 당신이 만든 모듈들입니다 귀하의 응용 프로그램에 대해 정의 된, 다른 화면, 만약 당신이 귀하의 신청서가 시간이 지남에 이러한 장면을 다른 방법으로 만들 수 있습니다

우선, 장면에는 항상 루트 또는 ViewGroup이 있습니다 기본적으로 그들과 관련되어있다 장면이 살아있는 계층 구조 전환이 일어날 것입니다 그래서 그 루트로 직접 씬을 만들 수 있습니다 EnterAction을 설정할 수 있습니다

그리고 그 장면이 입력 될 때마다, Runnable에 콜백이 생깁니다 그리고 어떤 코드라도 실행할 수 있습니다 어떤 조작을하고 싶다 당신은 뷰 계층 구조로 가고 싶다 매우 간단합니다

다른 방법보다 조금 수동입니다 장면을 만들 수 있습니다 예를 들어 ViewGroup에서 대신 생성 할 수 있습니다 일부 레이아웃 ID에서 계층 구조를 확장했다고 가정 해 보겠습니다 이 ViewGroup을 거기 앉아 있습니다

해당 ViewGroup을 사용하여 씬을 생성 할 수 있습니다 기본적으로 두 개의 ViewGroup을 제공합니다 장면 계층 구조의 루트로 생성 할 수 있습니다 장면 그 자체의 뿌리뿐만 아니라 그래서 당신은 그것을 전달합니다 당신은 씬을 만들었습니다

넌 잘하는거야 이제 장면이 입력되면, 해당 ViewGroup을 보도록 장면을 간단히 변경합니다 대신에 무엇을 해야할지 말할 필요가 없습니다 계층 구조를 조작합니다

ViewGroup에서 해당 정보를 가져옵니다 당신은 생성자에서 그것을 전달했습니다 마지막으로, 우리는 마지막 것과 매우 비슷한 것을 가지고 있습니다 그러나 ViewGroup에 전달하는 대신, 레이아웃 리소스 ID를 넘겨줍니다 그리고 그 장면이 입력되면, 그것은 자원을 부 풀릴 것입니다

그리고 그것은 앞으로 나아가고 그것을 장면 루트에 추가 할 것입니다 똑바로 레이아웃 리소스도 시작됩니다 리소스에 암시 적으로 장면을 만드는 경우 우리는 조금 나중에 보게 될 것입니다 자동으로 전환 관리자를 사용할 수 있습니다

주어진 레이아웃 리소스 ID를 암시 적으로 장면을 팽창시킵니다 그리고 그것은 두포에서 같은 메커니즘을 사용합니다 다음으로 전환을 살펴볼 수 있습니다 이들은 선언 책임이있는 엔진입니다 사물이 바뀌면 너는 무엇을하고 싶은가? 애플리케이션에서 장면에서 장면으로 그래서 이것들은 기본적으로 변경 전후에 듣습니다

그 값들을 비교하라 그리고 어떤 관점에서도 일어난 변화를 기반으로 장면 계층에서 애니메이터를 만듭니다 그런 다음 변경 사항을 애니메이션으로 실행합니다 전환을 만드는 데는 몇 가지 방법이 있습니다 이러한 것들을 직접 만들 수 있습니다

우리는 프레임 워크에 이미 정의 된 것을 가지고 있습니다 이동하고 크기를 조정하는 ChangeBounds가 있습니다 장면간에 변경되는 오브젝트 상황에 따라 퇴색하는 퇴색이 있습니다 그들이 장면 변경 사이에 오르거나 갈 것인지 여부

그리고 TransitionSet도 있습니다 이것은 AnimatorSet과 같은 트랜지션에 해당합니다 그것은 기본적으로 그룹입니다 그것은 여러 가지 전환을 안무의 방법입니다 TransitionSet을 만든 다음 모든 전환기 자녀들에게, 함께 또는 순차적으로 실행합니다

또한 집합 계층 구조 일 수도 있습니다 따라서 훨씬 복잡한 메커니즘을 가질 수 있습니다 병렬 또는 여러 개의 전환이 실행됩니다 더 재미있는 애니메이션을 얻기 위해 경험 마지막으로 전환을로드 할 수 있습니다

그게 당신이가는 길이면 리소스 파일에서 자원에서 실행하려면, 이것은 당신이 그것을 할 수있는 방법입니다 이 예는 TransitionSet입니다 자동으로 추가 된 두 개의 자식이로드 된로드됩니다 가시성의 변화를 경청하는 것, 크기 및 위치뿐 아니라 리소스 파일, 그렇지 않을 수도 있습니다

이미 코드를 사용하고 있기 때문에 코드에서 수행하려는 작업 UV 코드 비행 중에 이러한 것들을 만드는 것은 쉽습니다 다른 한편으로 이것은 이것이 메커니즘이다 그것이 부 풀릴 때 Transition Manager에서 사용하는 우리가 곧 볼 수있는 정보의 그래프, 이 슬라이드에는 아직 없습니다 마지막으로 사용자 지정 전환 아이디어가 있습니다

그래서 우리는 내가 말했듯이, 몇 가지 표준적인 변환을 정의했다 자동 전환 기능이 즉시 사용됩니다 보기를 이동하고 크기를 조정하는 ChangeBounds가 있습니다 가시성을 다루는 페이드도 있습니다 정보가 사라지고 사라집니다

매우 간단합니다 아마도 대부분의 경우 원하는 동작 일 것입니다 그러나 자신 만의 전환을 정의하려는 경우 – 예를 들어, 만약에 무언가가 생기면, 당신은 화면 중간에서 페이드 인하는 것을 원하지 않았다 그것이 사는 곳에서, 그러나 당신은 실제로 원합니다 오른쪽에서 밀어 넣으려면 당신은 커스텀 트랜지션을 작성할 수 있습니다

단순히 전환 클래스 자체를 하위 클래스로 만들면됩니다 그런 다음 세 가지 방법을 재정의합니다 그것은 당신이하고 싶은 일을합니다 두 가지 캡처 방법이 있습니다 하나는 응용 프로그램이 시작될 때 값을 캡처합니다

코드는 말했다, 좋아, 전이 할 준비가되었다 그것이 당신이 원하는 시점입니다 captureStartValues ​​메소드를 호출합니다 그리고 당신은 앞으로 나아가서 뷰 객체들로부터 읽습니다 당신이 원했던 모든 것은 전환에 영향을 미쳤습니다

예를 들어 레이아웃 위치를 읽을 수 있습니다 또는 당신이 관심을 갖는 가시성 정보 그리고 captureEndValues를 호출합니다 트랜잭션이 실제로 실행되기를 원할 때, 언제 시작하길 원하니? 그리고 나서 마침내 전화를받을 수 있습니다 그 후에 createAnimator 함수에 그 값들을 비교하고, 좋아, 좋아, 이 가시성 값이 변경되었습니다

그리고 그것은 제가 염려하는 것입니다 따라서 애니메이션을 만들어서 다음과 같이한다 오른쪽에서 밀어 넣는다 또는 그것이 무엇이든간에 해당 애니메이터를 반환합니다

그런 다음 전환 시스템이 실행합니다 그래서 우리는 단지 많은 것들을 가지고 있습니다 프레임 워크와 함께 무료로 배송 할 수 있습니다 전환을 실행할 때 암시 적으로 사용하십시오 그러나 사용자 정의 전환을 공정하게 만들려면 그렇게하는 것이 간단합니다

승인 이제 씬을 얻었습니다 당신은 전환이 있습니다 실제로 장면을 어떻게 바꾸나요? 한 장면에서 다른 장면으로 어떻게 가나 요? 당신은 단지 장면을 입력 할 수 있습니다 거기에 아무런 변화가 없습니다

기본적으로 말하기 만하면됩니다 너를로드하기를 바라는 장면 그리고 그렇게 할 것입니다 Runnable에 있던 코드가 실행됩니다 그것은 당신이 준 레이아웃 리소스 파일을 부 풀릴 것이고, 도대체 무엇이

현장에 들어갈거야 그곳에는 아무 것도 없습니다 물론 재미있는 애니메이션이 아닙니다 또는 장면 전환 관리자에게 장면으로 이동하도록 지시 할 수 있습니다 그리고 그 과정에서, 도중에 기본 전환을 사용합니다

그것은 말할 것입니다, 좋아, 나는이 장면으로 갈 것입니다 그리고 그동안 저는 StartValues를 캡쳐 할 것입니다 captureEndValues를 실행하고 기본 전환을 실행합니다 시스템 용 또는 사용자 지정 전환을 사용하여 실행할 수도 있습니다

당신은 말할 수 있습니다 좋아,이 멋진 전환을 정의했습니다 내가 갈 때 사용하고 싶다 이 특정한 장면 조합 사이에서, 그리고 지금 진행 전환 중 하나를 사용하여 전환 또는 전환 관리자에서 이동 메소드를 선택합니다 실제로 새로운 장면을로드합니다

그런 다음 사용자 정의 전환을 실행하십시오 전환, 단순화, 내가 여기에서 언급하지 않은 또 하나의 것이있다 이것은 전환 관리자의 아이디어입니다 당신은 보통 당신이 말하는 일회적 인 일을 위해서 이것을 사용할 것입니다, 전환 매니저,이 장면에 가고 싶습니다 내 사용자 지정 전환을 여기에서 사용하십시오

그것이 할 수있는 또 다른 일은 전체 정보 그래프를 지키다 모든 전환 조합에 대해 모든 장면 조합에 대해 원하는 것 당신이 당신의 신청서에 가지고있는 나중에 데모에서 조금씩 보게 될 것입니다 하지만 여기서 마지막으로 한 가지를 지적하고 싶습니다 마지막 흥미 진진한 슬라이드에 이 모든 정보를 가지고,이 모든 다른 클래스들 그것에 대해 생각하고 장면을 가지고 있어요 전환이 있었지만 실제로는 대부분의 개발 사례에서 애니메이션을 더 간단하게 만드는 것이 었습니다

그래서 일반적으로 유일한 방법은 아마도 이게 신경 쓰일거야 TransitionManagerbeginDelayedTransition을 호출합니다 그런 다음 장면 루트를 지정합니다 전환을 실행하고 싶습니다

그것이하는 일은 그 모든 과정에서의 킥입니다 현재 값을 캡처 할 것입니다 그러면 레이아웃과 렌더링이 실행됩니다 그리고 그 틀의 중간에, 최종 가치를 포착 할 것입니다 어떤 것이 있는지 파악한 다음 실행하십시오

당신을위한 자동 전환 대부분의 경우, 이것이 실제로 걱정하는 모든 것입니다 그것은 기본적으로 역동적 인 변화입니다 이것을 창조 및 애니메이션으로 생각할 수 있습니다 역동적 인 장면

따라서 이러한 미리 굽는 장면을 갖는 대신 레이아웃 리소스 ID를 사용하면 기본적으로 다음과 같이 말할 수 있습니다 좋아요 전환을 실행하여 준비하십시오 그때까지 나는 갈거야 변화를 일으킬 수 있습니다

그리고 나서 그 변화가 실제로 일어날 때까지 시작, 측정 및 레이아웃 실행, 시스템은 새로운 프레임을 그릴 준비가됩니다 그런 다음 전환이 시작되고 델타를 계산하고, 변경 사항을 파악하고 애니메이션을 만들고, 실행중인 애니메이션을 시작하십시오 매우 간단합니다 한 줄의 코드 좋은

승인 이제 데모를 간략하게 살펴 보겠습니다 KitKat과 함께 제공되는 API 데모 중 하나입니다 그래서 샘플에서 다운로드하도록 권장합니다 그리고 당신은 이것을 실행할 수 있고 그것으로 놀 수 있습니다

당신의 심장 내용 완전히 복잡하고 흥미로운 데모 그래서 여기 네 장면을 정의했습니다 그리고 장면은 사용자 정의보기를 사용합니다 그래서 특별한 이유가 없습니다

버튼 일 수 있습니다 나는 대신 그들에게 색깔의 직사각형을 만들어 냈습니다 그래서 우리가 장면들 사이에서 바꿀 때, 우리가 크기를 조정하는 것을 볼 수 있습니다 이것들을 재배치 그리고 우리는 그냥 바꿀 수 있습니다

취소 중입니다 우리가 방해하고 있습니다 우리는 다른 장면 전환을 실행 중입니다 매우 간단합니다 이제 데모 코드를 살펴 보겠습니다

여기에는 몇 가지 다른 조각이 있습니다 첫째, 몇 가지 레이아웃 파일이 있습니다 그래서 우리는 전환 장면 1을 가지고 있습니다 이것은 단지 레이아웃이 있습니다 그리고 거기에는 네 가지 견해가 있습니다

적절히 배치 전환 장면 2는 매우 비슷합니다 그것은 단지 크기와 위치가 다릅니다 색깔이있는 직사각형의 경우 전환 3은 합병증을 추가합니다

중간에 그레이 스케일 사용자 정의보기가 있음 그곳에 따라서 레이아웃 리소스에서 실제로 흥미로운 것은 없습니다 파일 하지만 나중에 리소스에서 언급 한 내용을 볼 수 있습니다 우리가 전환 관리자를 위해 팽창시킨 우리는 정의한 전환 정의를 가지고 있습니다

이것은 단순히 ChangeBounds입니다 여기서는 정말 흥미로운 것이 없습니다 그것은 단지 표준 ChangeBounds입니다 우리가 달릴거야 그러나 나중에이 리소스를 참조합니다

우리가 전환 관리자를 부 풀릴 때 다음은 좀 더 재미있는 이야기입니다 이것은 TransitionSet입니다 기본 모드로 실행됩니다 모든 전환이 병렬로 실행됩니다

동시에 ChangeBounds가 실행됩니다 그것은 페이드 전환을 실행할 것입니다 그리고 페이드는 특정 관점을 목표로 삼을 것입니다 또한 ID를 사용하여보기와 연결합니다 즉, 페이드는 일반적으로 적용되지 않습니다

화면의 모든 것,하지만 우리는 말하고 있습니다 이 특별한 전환을 계층 구조의이 특정보기에 표시됩니다 페이드 아웃은 매우 유사합니다 이 경우에도 진행됩니다 순차적으로 전환을 실행합니다

그래서 그것은 ChangeBounds를 실행할 것입니다 위치와 크기를 변경하십시오 그리고 그 일이 끝나면, 그것은 페이드를 돌 것입니다 그리고 마지막으로 전환 관리자가 있습니다 우리는 아직 보지 못했습니다

이것은 무엇의 그래프를 유지하는 객체입니다 장면에서 장면으로 가면서 당신이 원한다 귀하의 신청서에 너 여기서 정의 할 수있어 내 말은, 네가 어떤 관습도 필요 없다면 전환이 발생하면 전환 관리자는 신경 쓰지 않습니다 전환을 실행하면됩니다

그러나 당신이 장면 1에서 장면 2로 갈 때 당신이 신경 쓰면, 이 특별한 커스텀 트랜지션을 원하지만, 장면 2에서 장면 3에 다른 것을 원하면 최소한 리소스 파일에서 정의하는 방법입니다 따라서 전환 관리자를 만듭니다 그런 다음 여러 개의 전환 객체가 있습니다 원하는 상호 작용을 정의하는 이러한 특정 장면 변경에서 그래서 우리는 레이아웃 파일을 참조하는 fromScene을 가지고 있습니다 그리고 그것은 암묵적으로 팽창 할 것입니다

해당 레이아웃 리소스 파일을 열고 그 중에서 장면을 만듭니다 우리에게는 toScene이 있습니다 같은 것 레이아웃 파일에서 장면을 생성합니다 그리고 나서 우리는 그것이 다른 전환 자원에서 참조하려고한다

우리가 방금 보았던 것과 같은 파일 그게 전부 자원입니다 이제 transitionsjava에있는 코드를 살펴 보겠습니다 또한 API 데모에서는 Animations 디렉토리에 있습니다

그리고 그것은 단순 전환이라고합니다 그리고 여기 있습니다 여기에 많은 코드가 없습니다 전환 관리자가 부 풀리게됩니다 음, 우리는 천이 기 Inflator를 얻습니다

그리고 나서 우리는 Transition Manager를 팽창시킵니다 그리고 우리는 그 과정에서 세 장면을 만듭니다 그리고 우리는 3 개의 장면 만 생성한다는 것을 알 수 있습니다 그러나 데모에서는 실제로 4 개가있었습니다 그리고 우리는 몇 분 안에 그 이유를 보여줄 것입니다

우리가 코드에서 장면을 필요로하는 유일한 이유 여기가 우리가 지정한 곳입니다 그들은 특정 장면으로 전환하려고했습니다 우리는 이미 전환 관리자에게 말했습니다 우리가 장면을 따라 갈 때 어떤 장면 전환이 실행되는지 그리고 여기, 우리는 실제로 그 장면에 대한 참조를 얻고 있습니다

그리고 좋아, 이제 나는 움직이고 싶다 장면 1, 장면 2, 장면 3 그리고 우리가 여기서 하죠 데모에서 라디오 버튼을 클릭하면, 우리는이 품목 중 하나에 전화를 겁니다 그리고 우리는 말합니다, 좋습니다, Transition Manager, 저는 다음 장면으로 넘어 가기를 바랍니다

그리고 그것은 갈 것입니다 장면이로드됩니다 변경 사항을 파악하고 전환을 실행합니다 전환 관리자 리소스에서 지정한 우리가 본 파일 마지막으로 거기에 네 번째 장면이 있습니다

이 장면 객체와 아무 관련이없는 우리가 팽창시킨 그러나 대신, 이것은 제가 언급 한 것입니다 우리는 기본적으로 동적 인 장면으로 이전에 즉석에서 뷰 계층 구조 변경 전환 관리자가 있어야합니다 또는 전이 시스템, 일반적으로, 기본적으로 모든 변경 사항이 자동으로 애니메이션으로 표시됩니다 마법 메서드를 호출하고 beginDelayedTransition을 호출합니다

우리는 우리가 작업 할 장면 루트를 제공합니다 Set newSize라는 헬퍼 메서드를 호출합니다 기본적으로 우리는 임의적으로 변경합니다 뷰 계층 구조 내부 여기에 온다

뷰에 몇 가지 새로운 레이아웃 매개 변수를 설정합니다 그러면 내부적으로 요청 레이아웃이 생성됩니다 장면 루트 안의 것들이 중계 될 것입니다 다시 렌더링되었습니다 그리고 그런 일이 생길 때, Transition System 상황이 바뀌 었다는 것을 알아 차렸다

자동으로 전환을 실행합니다 당신이 데모에서 본 바와 같이, 이 단일 코드 줄로 내용의 크기가 조정됩니다 그래서 그것은 전환입니다 KitKat의 새로운 기능입니다 나는 시간이 지남에 따라 더 많이 일할 것으로 예상한다

지금은 상당히 간단하고 간단합니다 그리고 더 중요하게는 단순 해지기를 바랍니다 더 풍부한 안드로이드 응용 프로그램을 만드는 데 사용할 수 있습니다 감사

Maps Live: Map Padding in the Google Maps Android API v2

안녕하세요 Google 개발자의 에피소드에 오신 것을 환영합니다

살고 있다 저는 Google Maps Developer Relations 팀의 Sarah Maddox입니다 지도를 사용하는 방법을 보여 드리겠습니다 Google Maps Android API로 패딩 지도가있는 애플리케이션이 있다고 가정 해 보겠습니다

사이드 바를지도에 추가하려면 하지만지도 UI 컨트롤이나 Google을 숨기고 싶지는 않습니다 심벌 마크 추가하면 어떻게되는지 봅시다 지도 패딩을 추가하지 않고 사이드 바를 만듭니다 이 작은 데모 응용 프로그램에는 오른쪽에 사이드 바가 있습니다

그리고 내 위치 컨트롤 찾기를 볼 수 있습니다 오른쪽 상단에 있지만 사이드 바에 의해 가려져 있습니다 마찬가지로지도 확대 / 축소 컨트롤 오른쪽 하단에 있으며 완전히 숨겨져 있습니다 그래서이 응용 프로그램으로 내가 한 일은 padded라는 버튼을 추가합니다 그리고 내가 덧대는 단추를 만지면, 응용 프로그램은 다음과 같은 메소드를 호출합니다

지도의 오른쪽에 30 픽셀의지도 패딩을 추가합니다 이제 UI 컨트롤이 멋지게 보입니다 내 사이드 ​​바 왼쪽에 약간 표시됩니다 지도는 여전히 전체보기를 사용합니다 그러나 사용자 컨트롤과 제스처 그들이 단지 사용하지 않는 것처럼 행동한다

지도의 더 작고 눈에 보이는 부분 그래서 내 위치 찾기 찾기를 탭할 것입니다 그리고 당신은 작은 파란색 위치 표시기가지도의 중심에 잘 배치되어 있습니다 지도 패딩을 고려했습니다 이제 정상적인 버튼을 누르면 내지도에서지도 패딩을 제거한 다음 내 위치 버튼을 다시 찾으십시오

위치 표시기가 약간 움직 였는지 확인하십시오 오른쪽으로 가면 중심에서 벗어난 것처럼 보입니다 전체지도를 고려하고 있기 때문입니다 보이는 부분 대신에 좋아, 나는 시드니를 만지고 위치를 잡을거야

호주 수학의 중심 그래서 주위에 멋진 푸른 바다가 많이 있습니다 그러면 Google 로고를 볼 수 있습니다 화면 왼쪽 하단에 있습니다 이제는 애플리케이션 요구 사항에 주목할 가치가 있습니다 Google 로고를 표시합니다

Google 로고가 숨겨져 있다면 Google지도의 서비스 약관을 준수하지 않음 아피스 따라서 UI 컨트롤을 왼쪽 하단에 추가해야하는 경우 맵의 패딩은 좋은 방법입니다 Google 로고가 나타나는지 확인하십시오 자, 코드를 살펴 보겠습니다 매우 간단합니다

Google지도 세트 패딩 사용 메서드를 사용하여지도 가장자리에 패딩을 추가합니다 이 메서드는 패딩을 결정하기 위해 네 개의 매개 변수를 사용합니다 왼쪽, 위쪽, 오른쪽 및 아래쪽 가장자리에 매개 변수 이름은 기억하기 쉽습니다 왼쪽, 위쪽, 오른쪽, 및 바닥 지도 재 센터링 (re-centering)과 같은 카메라 업데이트, 자동으로 패딩 처리됩니다

따라서 오프셋을 직접 계산할 필요가 없습니다 그리고 언제든지지도 패딩을 동적으로 변경할 수 있습니다 세부 사항은 문서에 있습니다 또한 Google지도 API 데모 앱을 살펴보십시오 Google Play 서비스와 함께 제공됩니다

다음은 데모에 대한 설명서 링크입니다 앱 그것은 내가 여러분에게 보여준 것보다 더 복잡한 예입니다 예를 들어, 애니메이션을 추가 할 수 있습니다 사이드 바를 안팎으로 밀어 넣을 수 있습니다

패딩 데모는 데모 앱에서 보이는 영역이라고합니다 메뉴 감사합니다 Google에서이 동영상을 즐기 셨기를 바랍니다 개발자 라이브

ExoPlayer: Flexible Media Playback for Android (Google I/O '17)

[음악 재생] OLIVER WOODMAN : 제 이름은 Ollie입니다 앤드류입니다

이곳에서 많은 사람들을 만나서 반갑습니다 나는 긴 하루 였음을 안다 그리고 오늘 우리는 당신에게 미디어 재생에 관해 이야기 할 것입니다 ExoPlayer를 사용하여 Android에서 우리가 다룰 내용에 관해서, 우리는 정말로 모든 사람들을 위해 약간의 노력을 기울일 것입니다

이 이야기에서 이것이 의미하는 것은 우리가 시작할 것입니다 몇 가지 기본 사항이 있습니다 그래서 우리는 ExoPlayer가 무엇인지 간략하게 논의 할 것입니다 우리는 몇 가지 기능에 대해 논의 할 것입니다

우리는 당신에 관해서 조금 이야기 할 것입니다 ExoPlayer를 사용하고 싶을 수도 있습니다 그리고 우리는 간단한 예제를 통해 어떻게 시작할 수 있는지 보여줍니다 그 후, 아마도 이미 더 많은 사람들을 위해 ExoPlayer에 익숙하다면 좀 더 진보 된 주제를 통해 아주 빨리 달릴 수 있습니다 그래서 우리는 미디어 구성에 대해 이야기 할 것입니다

ExoPlayer v2의 새로운 기능입니다 우리는 ExoPlayer의 내부에 대해 이야기 할 것입니다 어떻게 작동하는지 조금씩 설명하겠습니다 재생이 실제로 어떻게 작동하는지 설명합니다 그리고 마침내 우리는 그 지식을 바탕으로 우리가 어떻게 당신이 진짜로 주문을 받아서 만들 수 있는지에 대해서 이야기하기 시작할 것입니다

ExoPlayer가 일치하는 작업을 잘 수행하도록 미세 조정 특정 유스 케이스 좋아, 시작하자 ExoPlayer 란 무엇입니까? 따라서 ExoPlayer에 익숙하지 않은 사용자의 경우 이미 Android 용 미디어 재생 라이브러리입니다 그것은 Jelly Bean 이상에서 작동합니다 자바로 작성되었습니다

Android 개발자로서 이미 언어로되어 있습니다 네가 가장 잘 알고있는 것 ExoPlayer를 원할 경우 종속성으로 포함 시키십시오 다른 Java 라이브러리를 포함하는 것처럼 말입니다 또한 오픈 소스이기도합니다

그래서 만약 당신이 체크 아웃 영감을 이 이야기 후에 우리의 소스 코드, 당신은 쉽게 그것을 할 수 있습니다 그리고이 프레젠테이션의 마지막 슬라이드 실제로 GitHub 저장소에 대한 링크가 있습니다 기능면에서 우리는 먼 길을왔다 우리는 처음에 소스 ExoPlayer를 열었 기 때문에 2014 년 Google I / O에 돌아 왔습니다 초기 릴리스에서는 DASH 및 SmoothStreaming 적응 형 미디어 재생, 주로 조각 형식의 MP4를 컨테이너 형식으로 사용합니다

또한 TTML 캡션과 공통 암호화도 지원했습니다 그 후 우리는 지원을 추가했습니다 HLS 및 MPEG-TS 컨테이너 포맷의 경우, 추가 캡션 형식도 제공합니다 그 이후로 우리는 정말로 바빴습니다 더 많은 전통적인 미디어에 대한 지원 추가 MP3, MP4, Ogg 및 Matroska와 같은 형식을 지원합니다

우리는 또한 다른 여러 가지 확장 기능을 제공합니다 ExoPlayer 확장은 어떤 방법입니까? 다른 라이브러리의 기능을 ExoPlayer에 가져 오는 것 따라서 구체적인 예로서 OkHttp를 네트워킹으로 사용한다면 귀하의 응용 프로그램의 나머지 부분에 대한 스택, 실제로 똑같은 네트워킹을 사용하고 싶을 수도 있습니다 미디어 재생을위한 스택 그리고 OkHttp 확장 기능을 사용하여이를 수행 할 수 있습니다

그와 똑같은 네트워크 스택을 내부에서 사용할 수 있습니다 ExoPlayer 그래서 이것은 작년 중반까지 우리를 데려옵니다 그리고이 시점에서 우리는 좀 뒤로 물러났습니다 우리는 꽤 심오한 건축상의 변화를 만들었습니다

플레이어 내부 우리는 ExoPlayer 버전 2를 출시했습니다 이 릴리스에서 우리는 지원을 받았다 MultiPeriod DASH 지원과 같은 고급 기능을 사용하려면, gapless 오디오 및 미디어 구성, 우리가 아주 말할 게있는 것이지 한참 동안 많이

동시에 우리는 ExoPlayer를 사용하기 쉽게 만들려고 노력했습니다 그래서 우리는 간단한 ExoPlayer보기를 추가했습니다 죄송합니다 단순한 ExoPlayer는 다소 높은 수준입니다 ExoPlayer를 사용하기위한 API 및 일부 재생 UI 당신이 얻을 수있는 구성 요소 정말 빨리 상자에서 시작했습니다

그 이후로 우리는 더 많은 기능을 추가했습니다 특히 우리는 최근에 지원을 추가했습니다 가변 속도 재생 용 그리고 우리는 또한 우리의 능력을 키워 왔습니다 재생 된 미디어를 캐시 할 수 있습니다

그리고 이것은 오늘날 우리가있는 곳입니다 그리고이 슬라이드에서 가져온 핵심 요소 반드시 이해해야하는 것은 아닙니다 그 위에있는 모든 것 특정 유스 케이스에 맞는 것 같습니다 이 기능 중 아주 작은 하위 집합 만 있으면됩니다

여기에있는 주요 테이크 아웃은 실제로 ExoPlayer입니다 완전히 완벽한 기능을 갖춘 미디어 라이브러리로 진화했다 지금 Android 용 미디어 재생 사용 사례가있는 경우, 아마 ExoPlayer는 당신이하고 싶은 것을 지원할 것입니다 이제 우리는 거기에있는 특징들에 대해 조금 알고 있습니다

ExoPlayer를 사용하는 것이 적절한 지에 대해 이야기 해 봅시다 그리고 명백하게 대안을 사용하는 것이 의미가있을 때 ExoPlayer는 Android의 MediaPlayer API에 내장되어 있습니다 따라서 주목할 첫 번째 점은 MediaPlayer 다시 안드로이드 시작 부분까지 작동합니다 ExoPlayer는 Jelly Bean 이상입니다 이전보다 훨씬 적은 문제입니다

실제로 활성 Android 기기의 약 2 % 만 사용됩니다 아직 안드로이드의 이전 버전에서 그러나 제공에 대해 그 2 %에 대한 지속적인 지원을 한 다음 MediaPlayer 최선의 방법이 될 것입니다 사용 사례에 따라 이러한 솔루션 각각 MediaPlayer가 가장 적합합니다 간단한 사용 사례

그래서 MP3를 가지고 있다면 APK에 번들로 묶어 놓은 것일 수도 있습니다 앱 내에서 재생하려면 MediaPlayer를 당신을 위해 잘 작동 할 것입니다 어쩌면 당신은 이미 그것을 사용하고있을 것입니다 그리고 전환해야하는 실제 이유가 없습니다 ExoPlayer가 실제로 자체적으로 제공되는 곳 고급 사용 사례를위한 것입니다

DASH, SmoothStreaming을 포함한 모든 종류의 적응 형 스트리밍 및 HLS를 사용하고 실제로 일부 고급 기능을 활용하고자합니다 ExoPlayer는 미디어 구성 및 캐싱과 같은 기능을 제공합니다 염두에 두어야 할 또 다른 차이점 이 두 API가 설계된 방식입니다 MediaPlayer는 대단히 블랙 박스입니다 당신은 내부 동작에 대해 많은 통제력을 갖지 못합니다

플레이어의 반대로 ExoPlayer는 실제로 디자인되었습니다 매우 맞춤화되고 확장 가능해야합니다 그리고 당신은 정말로 발굴하고 시작할 수 있습니다 ExoPlayer 내부의 다양한 다이얼을 미세 조정하기 원하는 방식으로 일을 처리 할 수 ​​있습니다 그래서 ExoPlayer는 아마 당신이 아마 최고 일 것입니다

고급 사용자이고 이러한 것들을 조정할 수 있습니다 마지막으로 중요한 고려 사항 플레이어가 실제로 어디에 있는지의 차이를 고려하는 것입니다 MediaPlayer 및 ExoPlayer를 사용하면 오래 살 수 있습니다 따라서 MediaPlayer를 사용할 때, 왼쪽에서 볼 수 있듯이, MediaPlayer 구현은 실제로 안드로이드 운영체제에서 그리고 여기에있는 부분은 여러분이 보는 수평선입니다

아래는 운영체제입니다 ExoPlayer를 사용하면 실제 플레이어 구현은 응용 프로그램의 일부로 제공됩니다 그리고 그것은 정말로 아주 낮은 수준의 미디어로 전달됩니다 주로 액세스를 제공하기위한 플랫폼의 API 하드웨어 디코더 그렇다면 왜 이것이 중요한가? 한 가지 이유는 Android의 미디어 파워 실제로 시간이 지남에 따라 진화했다 그래서 그 결과로, 당신이 얻는 행동 Android 출시부터 Android 출시까지 약간 다를 수 있습니다

ExoPlayer와는 대조적으로, 우리는 장점이 있습니다 따라서 플레이어의 단일 버전을 배송 할 수 있습니다 응용 프로그램 내부 그리고 당신은 똑같은 버전을 얻을 것입니다 모든 버전의 Android에서 사용할 수 있습니다

ExoPlayer는 실제로 매우 일관된 경험을 제공하기 위해 더 좋은 위치에 있어야합니다 이 모델의 또 다른 중요한 이점 새 기능을 추가 할 때 일반적으로 ExoPlayer를 사용하여 Jelly Bean으로 되돌아가는 지원, MediaPlayer의 새로운 기능인 반면 후속 릴리스에서만 사용할 수 있습니다 Android의 이러한 이점에 대한 흥미로운 예 실제로 가변 속도 재생을 지원합니다 그래서 이것은 Marshmallow의 MediaPlayer에서 지원되었습니다 그리고 최근에는 ExoPlayer에서 지원을 추가했습니다

우리는 새로운 저수준에 대한 의존성이 없었기 때문에 미디어 API 또는 플랫폼의 모든 것, 우리는 Jelly Bean에게 지원을 추가 할 수있었습니다 우리가 다음에 발견 한 것은 실제로 재생 속도 및 피치 조정 구현의 버그 MediaPlayer와 ExoPlayer 모두에 영향을 미쳤습니다 그리고 우리는 그 버그를 다시 고칠 수있었습니다 ExoPlayer가있는 Jelly Bean으로 돌아 가면, MediaPlayer는 O 이상에서만 사용할 수 있습니다 그래서이 시점에서, 당신은 몇 가지 이점을 볼 수 있기를 바랍니다

ExoPlayer가 있습니다 하지만 너는 네가 그것을 사용하는 것이 더 확신 할 수있다 어떤 사람들이 이미 그것을 사용하고 있다는 것을 알고 있다면 그리고 우리가 실제로 ExoPlayer는 Google 자체 애플리케이션에서 매우 광범위하게 사용됩니다 가장 눈에 띄는 YouTube는 분명합니다

거대한 비디오 스트리밍 서비스 및 Google Play 무비 및 Google 포토와 같은 애플리케이션 실제로 우리는 실제로 강력한 채택을 보았습니다 넓은 개발 공동체에서도 마찬가지입니다 그래서 여기에 몇 가지 응용 프로그램이 있습니다 일부 ExoPlayer를 사용하거나 다른 용도로 사용할 수 있습니다 그리고 그것은 단지 어느 정도는 아닙니다

실제로 Play 스토어에는 140,000 개가 넘는 응용 프로그램이 있습니다 ExoPlayer를 사용하고 있습니다 앱 중 하나 인 경우 감사합니다 당신의 입양을 위해 그리고 우리에게 의견을 계속 보내주십시오 우리와 실제로는 정말 중요합니다

우리가하는 일을 많이 안내합니다 다음 번에는 몇 가지 코드로 다이빙을 할 것입니다 간단한 예를 보여줍니다 그 때문에 나는 너를 앤드류에게 넘기겠다 앤드루 루이스 : 안녕하세요

[박수 갈채] 기존 앱이 있다고 가정 해 보겠습니다 MP4 플레이어를 추가하고 싶습니다 그 응용 프로그램에 – 그래서 그냥 간단한 비디오를 보여주는 기존 앱에서 최소한의 변화를 겪을 것입니다 ExoPlayer를 사용해야합니다 첫 번째 단계는 ExoPlayer에 대한 의존성 그리고 두 가지 주요 옵션이 있습니다

이리 ExoPlayer 라이브러리 전체를 가져올 수도 있습니다 또한 적응 형 스트리밍 형식에 대한 지원도 포함됩니다 DASH 및 HLS와 유사합니다 그리고이 줄은 build

gradle 파일에서 사용할 수 있습니다 이것은 주방 싱크 옵션의 일종입니다 그래서 대안은 선택하고 선택할 수 있다는 것입니다 ExoPlayer 라이브러리의 특정 모듈 너는 필요해 이 예제에서는 종속성을 추가 할 것입니다

주요 플레이어가 포함 된 핵심 라이브러리 분명히 MP4와 같은 일반 미디어도 지원합니다 및 MP3 그리고 UI 라이브러리에는 여기에도 의존성이 있습니다 SimpleExoPlayerView를 가져옵니다 최소한이지만 사용자 정의 할 수있는 플레이어입니다

앱에 넣을 수 있습니다 그래서 우리가 의존성을 추가하면, 다음 단계는 일부 코드 스 니펫을 추가하는 것입니다 당신의 활동에, 그것은 플레이어를 창조하고 그것을 사용할 것입니다 그래서 우리는이 ExoPlayer 팩토리를 가지고 있습니다 여기에는 플레이어 인스턴스를 만드는 몇 가지 방법이 있습니다

그리고 이것을 사용하는 것이 가장 쉽습니다 컨텍스트와 트랙 선택기가 필요합니다 그리고이 간단한 사용 사례를 위해 우리는 DefaultTrackSelector를 사용합니다 당신이하고 싶은 거의 모든 것에 대해 합리적인 기본값을 가지고 있습니다 플레이어를 만든 후에는 다음 단계 앱 레이아웃에보기를 드롭하는 것입니다

setPlayer를 호출하여 플레이어에 바인딩합니다 방법 이제 가장 중요한 것은 플레이어에게 우리가 놀고 싶어 그리고 이것을 위해 우리는 MediaSource를 사용할 것입니다 ExoPlayer에서 재생할 수있는 모든 것은 MediaSource입니다

미디어 로딩을 담당합니다 플레이어에게 제공하는 것입니다 그래서 우리는 ExtractorMediaSource를 만들 것입니다 MP4, MP3, Matroska 파일 등이 있습니다 그래서 당신은 그것을 prepare 메소드에 넘깁니다

그리고 setPlayWhenReady를 호출합니다 플레이어에게 버퍼링이 완료 되 자마자 재생이 시작되면 재생이 시작됩니다 그리고 마침내 당신이 재생이 완료되면 플레이어 플레이어가 코덱과 같은 시스템 리소스를 보유하기 때문에 버퍼에 메모리를 사용합니다 따라서 이러한 코드 스 니펫은 일반적으로 앱의 활동 라이프 사이클 메소드로 이동하십시오 그래서 이것은 당신이 가진 것에 대한 비디오입니다

나는 런던의 스카이 라인에 대한 멋진 비디오를 가지고있다 기본 재생 기능이 있음을 알 수 있습니다 재생 및 일시 중지 단추 및 탐색 모음과 같은 컨트롤 그래서 이것을 시험해보고 싶다면, I / O의 일부로 코드 테이블이 게시됩니다 당신은 가서 시도 할 수 있습니다

개발자 가이드도 있습니다 우리의 프로젝트 페이지에서이 단계들을 안내 할 것입니다 제가 언급했듯이, 여러분이 할 수있는 모든 것 미디어 소스입니다 그리고 그것은 플레이어를위한 미디어를로드하는 책임이 있습니다 그리고이 예제에서는 ExtractorMediaSource를 사용했습니다

실제로는 다른 고급 미디어가 있습니다 소스를 사용할 수 있습니다 DASH에 대해 들어 보셨습니까? 스트리밍을위한 사양입니다 자질 간의 적응을 허용한다 다양한 네트워크 조건을 처리합니다

DASH 지원을 위해 DASHMediaSource를 제공합니다 우리는 또한 지원을위한 HLS 미디어 소스를 가지고 있습니다 HTTP 라이브 스트리밍과 SmoothStreaming을위한 미디어 소스 최근의 v2 릴리스에서는 또한 MediaSources의 새로운 카테고리를 추가했습니다 구성을 위해 설계되었습니다

그리고 구성에 의해 우리는 함께 합류하는 것을 의미합니다 다른 미디어 소스 왜 우리가 이것을하고 싶습니까? 글쎄, 나는 예제를 통해 갈 것이다 그럼 우리가하고 싶은 비디오가 있다고 가정 해 봅시다 또한 별도의 파일에있는 일부 자막은 SRT 파일

이 경우 ExtractorMediaSource를 만들 수 있습니다 비디오를로드하려면 단일 샘플 미디어 소스가 필요합니다 SRT 파일을로드하려고합니다 그리고 나서 비디오와 함께 자막을 재생할 것입니다 이제 너 스스로 시도하고 할 수있어

플레이어 위치를보고 및 재생 위치를 자막과 동기화하는 단계 당신이 보여주는거야 그러나 이것은 일반적으로 일반적으로하기가 실제로 어렵습니다 MergingMediaSource를 사용하는 것이 훨씬 쉽습니다 그리고 MergingMediaSource는 비디오를 가져옵니다 자막을 재생하고 싶다

당신을 위해 모든 것을 처리합니다 그래서 그것은 동기화를 처리 할 것입니다 그런 다음 플레이어에 표시됩니다 당신이 작곡을 사용할 또 다른 시간은 재생 목록을위한 것입니다 그래서이 경우에, 당신은 MP3의 앨범이 있다고 다시 재생하고 싶습니다

너 스스로 시도하고 할 수있어 첫 번째 스트림을 재생 한 다음 스왑 아웃하여 다음 소스 하지만 플레이어가이기 때문에 큰 일이 아닙니다 소스를 바꿀 때 버퍼링됩니다 그래서 우리는 ConcatenatingMediaSource를 추가했습니다, 어떤 소스의 목록을 당신이 걸립니다 함께 결합하고 그들을 연주하고 싶다

일관된 버퍼링 정책으로 백 – 투 – 백 따라서 플레이어에게 3 초의 미디어가 있다고 말하면 항상 버퍼링 된 다음에는 전환을 가로막는 경우에도 그러한 경우인지 확인하십시오 한 소스에서 다음 소스로 또한 gapless 재생 메타 데이터도 지원합니다 따라서 MP3 파일을 완전히 재생할 수 있습니다

원활한 재생 또한 구성도 매우 유연합니다 그래서 우리가 본 두 가지 예를 결합 할 수 있습니다 따라서 병합 된 소스와 동영상을 연결합니다 이전에 자막을 만들었습니다

그리고 그렇게한다면, 이것이 당신이 얻게 될 것입니다 첫 번째 동영상이 재생됩니다 그런 다음 첫 번째 동영상이 완료되면 우리는 다음 비디오로 자연스럽게 전환합니다 자막이 올라 오는 것을 볼 수 있습니다 우리가 기대했던대로

그래서 이것은 위대합니다 우리는 이러한 미디어 작품을 재생할 수 있습니다 그래서 우리는 이것을 구현했습니다 그리고 나서 우리는 생각했습니다 잠깐 만요

이 seekTo 메서드가 플레이어에 있습니다 하지만 이제 우리는 재생하고 싶은 재생 목록을 가지고 있습니다 여러 소스가 있습니다 타임 스탬프는 정보가 충분하지 않습니다 당신이 더 이상 추구하고 싶은 곳을 아는 것

그래서 우리는 이것에 대해 생각하고 생각했습니다 재생할 수있는 다른 유형의 미디어 소스, 라이브 미디어 소스처럼 그리고 우리는 앱에 폭로하는 방법이 정말로 필요하다는 것을 깨달았습니다 미디어 소스의 구조 그리고 어떤 미디어를 사용할 수 있습니다 그래서 어떤 것을 알 필요가 있는지의 문제를 해결하기 위해서 소스를 찾으려는 경우 매개 변수를 추가했습니다

플레이어에게 소스를 알려줍니다 원하는 재생 목록에 있습니다 그리고 나서 우리는 필요하다고 생각했습니다 사용 가능한 미디어에 대한 설명 그래서 타임 라인이라는 새로운 데이터 구조를 추가했습니다

타임 라인은 기본적으로 표현입니다 미디어 소스에서 사용할 수있는 모든 미디어를 그리고 창 목록으로 구성됩니다 각 창은 재생 목록의 한 항목으로 이동합니다 그리고 그것은 미디어의 어떤 부분을 묘사합니다 당신은 어떤 주어진 순간에 추구 할 수 있습니다

그래서이 예제를 보여 드리겠습니다 조금 더 명확하게 해줍니다 그래서 우리는 하나의 소스를 가지고 있다고 상상해 봅시다 당신은 어디에서나 찾을 수 있습니다 여기서 빨간 선은 하나의 창을 나타냅니다

왼쪽의 점은 이 미디어 소스의 기본 시작 위치는 0입니다 그래서 플레이어가 소스에 도달하면, 그것이 연결된 경우에는 시간이 0이 될 것입니다 그리고 그 창문은 끝까지 펼쳐져 있습니다 미디어 소스의 지속 시간 더 흥미로운 경우는 두 소스를 연결하는 경우입니다

함께 그리고이 경우, 당신은 타임 라인으로 끝납니다 두 개의 창이 있습니다 보시다시피 두 창 모두에서 시작 위치는 해당 소스의 시작 부분에 있습니다 라이브 미디어 소스가 있다면 어떨까요? 이 경우 타임 라인은 실제로 동적입니다

실시간 이벤트가 진행됨에 따라 더 많은 미디어 창에서 사용할 수있게되었습니다 그리고 기본 위치가 라이브 에지를 추적 중입니다 그리고 라이브 이벤트가 완료되면, 기본 위치가 처음으로 다시 스냅됩니다 그래서 이것은 정규 스트림이됩니다 처음부터 재생이 시작되고 어떤 직책을 추구 할 수있다

그리고 우리는 이것을 바탕으로 일반 스트림과 라이브 스트림의 연결 그리고 이것은 당신이 기대하는 방식으로 작동합니다 따라서 소스를 연결하면 끝나는 타임 라인으로 끝나라 창의 연결 그 개별 소스 중 따라서이 타임 라인이 노출 된 것을 볼 수 있습니다

ExoPlayer의 최상위 API에서 현재 타임 라인을 얻을 수 있습니다 플레이어를 찾을 때 창 인덱스를 전달할 수 있습니다 재생 목록의 두 번째 항목을 찾으십시오 특정 오프셋에서

그리고이 창에 대한 세부 정보를 검사 할 수 있습니다 창문이 어디서 시작되고 얼마나 오래 있는지 지금은 Ollie로 돌아가서 내부에 대해 조금 이야기합니다 선수들의 올리버 우먼 : 앤드류가 말했듯이, 이제 우리는 ExoPlayer에 대해 좀 더 깊이 들어가기로했습니다 내부적으로 일어나는 일에 대해 재생 중

그리고 우리가이 일을 할 이유는 우리가 얘기 한 후에 내부 구성 요소의 우리가 어떻게 그것들을 커스터마이징 할 수 있는지에 대해 이야기하고 플레이어를 특정 유스 케이스에 맞게 미세 조정할 수 있습니다 여기 ExoPlayer가 있습니다 재생할 MediaSource를 받았다 중요한 내부 구성 요소는 무엇입니까? 첫 번째 중요한 구성 요소 언급해야 할 것은 렌더러입니다 렌더링을 담당하는 렌더러 미디어의 단일 구성 요소

따라서 VideoRenderer는 비디오 만 디코딩하고 표시합니다 AudioRenderer도 마찬가지로 해독 해 출력합니다 그냥 오디오 실제 ExoPlayer 인스턴스는 텍스트 및 메타 데이터와 같은 항목에 대한 추가 렌더러 보유 게다가 그러나 우리는이 다이어그램에서 이들을 생략 할 것입니다

단순함을 위해서 중요한 또 다른 구성 요소는 TrackSelector입니다 미디어 소스가 실제로 노출 될 수 있음 플레이어가 재생할 수있는 여러 개의 트랙 특히 DASH 또는 HLS 적응 재생이있는 경우, MediaSource가 실제로 여러 비디오 스트림을 노출 할 수 있습니다 다른 해상도에서, 그리고 아마 여러 오디오 언어 게다가

그리고 TrackSelector의 역할 해당 트랙의 하위 집합을 선택하려면 플레이어가 버퍼링하고 재생해야합니다 우리가 얘기해야 할 마지막 구성 요소는 LoadControl입니다 LoadControl에는 실제로 두 개의 작업이 있습니다 첫 번째 작업은 MediaSource에 알려주는 것입니다 그것이이 시점에서 버퍼링되어야하는지의 여부

그리고 이것은이 도표에 표시되어 있습니다 왼쪽에있는 녹색 점으로 그래서 우리는 아직 재생을 시작하지 않았기 때문에, 우리는 아무 것도 버퍼링하지 않습니다 따라서 MediaSource를 나타내는 것은 녹색입니다 버퍼링해야합니다

두 번째 임무는 재생할 때 플레이어에게 알려주는 것입니다 실제로 시작할 수 있습니다 이것은 오른쪽 점으로 표시됩니다 그리고 우리는 아직 어떤 언론도 가지고 있지 않기 때문에, 분명히 너무 빨리 재생을 시작할 수 있으므로 빨간색입니다 우리가 언급해야 할 구성 요소 중 하나는 데이터 소스입니다 MediaSources는 데이터 소스를 사용하여 실제 미디어를로드합니다

재생을 위해 플레이어에게 제공 할 것입니다 그래서 몇 가지 주요 구성 요소를 제공했습니다 그러나 어떻게하면되는지에 대해 조금 이야기 해 봅시다 이러한 구성 요소는 실제로 재생 중에 상호 작용합니다 아직 우리는 아무것도 버퍼링하지 않았습니다

그리고 LoadControl은 MediaSource에게 그것을 버퍼링해야합니다 MediaSource가 데이터로드를 시작합니다 데이터 소스를 통해 그리고 충분한 미디어가로드 된 후, 아마 보통의 미디어 파일에 대한 헤더 일뿐입니다 MediaSource가 해결할 수있을 것입니다 트랙을 실제로 플레이어에게 노출시킬 수 있습니다

그리고 이것은 TrackGroups라는 것을 노출시킴으로써 이것을합니다 이제 우리는 TrackSelector가 실제로 재생할 트랙을 선택합니다 그러나 TrackSelector는 다른 것을 필요로합니다 그리고 다른 이유가 필요한 이유 다른 장치가 다른 기능을 가지고 있다는 것입니다 특히 VideoRenderer 특정 해상도까지만 디코딩 할 수 있습니다

따라서 MediaSource가 4K 비디오 스트림을 노출하더라도, 저가형 기기를 사용한다면 TrackSelector에 대해 이해하지 못한다 실제로 해당 스트림을 선택합니다 우리가 이러한 종류의 능력을 대표하는 방식 플레이어에서 각 렌더러가 뭔가를 노출하고 있습니다 RendererCapabilities 객체를 호출했다 그것은 구체적으로 실제로 처리 할 수있는 것을 설명합니다

다음은 TrackGroups RendererCapabilities가 TrackSelector에 보내집니다 TrackSelector는 마술을합니다 선택을 생성합니다 그리고 그 선택은 MediaSource로 돌아갑니다 이 시점에서 MediaSource는 알고 있습니다

버퍼링 할 것이기 때문에 트랙 선택이 무엇인지 알고있다 그래서 몇몇 버퍼를 할당한다 물론 우리는 아직 실제로 재생을 위해 유용한 미디어를로드했습니다 LoadControl은 여전히로드 할 MediaSource를 알려줍니다 따라서 MediaSource는 계속해서 데이터를로드합니다

버퍼를 채우기 시작합니다 그리고 여기서 볼 수있는 것은 곧 이러한 버퍼가 가득 차기 시작하면, 렌더러는 실제로 그 버퍼로부터 소비되기 시작한다 상기 미디어 데이터를 그들의 디코더를 통해 공급하는 단계로서, 재생 준비 그래서 지금 우리는 미디어 버퍼를 가지고 있습니다 렌더러는 약간의 미디어를 해독했습니다 그래서 그들은 일종의 준비가되어 있고 갈 준비가되어 있습니다

그래서 LoadControl은이 시점에서 실제로 재생을 시작하십시오 작은 빨간 원이 녹색으로 변했습니다 물론 MediaSource는 지속적으로 버퍼를 사용하고 있습니다 그리고이 시점에서 우리는 실제로 많은 미디어를 버퍼링했습니다 그래서 왼쪽에있는이 버퍼들은 꽤 꽉 찼습니다

물론 우리는 임의적으로 멀리 버퍼링하고 싶지 않습니다 따라서 LoadControl은이 시점에서 버퍼링을 중지 할 수 있습니다 재생이 계속되기 때문에 렌더러 여전히 소비하고 있습니다 따라서 이러한 버퍼는 다시 유출됩니다 낮은 수준으로

물론 우리는 버퍼가 부족한 것을 원하지 않습니다 LoadControl은 버퍼링을 다시 토글 할 수 있습니다 그래서이 패턴이 떠오르게됩니다 DataSource를 통해 데이터를 가져 오는 중 MediaSource로 보내고 렌더러로 보내야합니다 염두에 두어야 할 또 하나의 복잡성 Andrew가 말했듯이, 당신이 이것에 대해 생각할 때, MediaSource는 실제로 예를 들어, 다른 동영상

그런 동영상의 트랙 선택이 다를 수 있습니다 유효한 그리고이 과정이 계속되면서, 실제로 추가 트랙 선택을 얻을 수 있습니다 동시에 일어난다 여기에서는 계속해서 재생을 시작합니다

버퍼가 채워지고 배수됩니다 그리고이 데이터 패턴이 간헐적으로 읽혀지는 것을 보았습니다 데이터 소스를 통해 지속적으로 소비 됨 렌더러에 의해 이제 중요한 구성 요소가 어떻게 작동하는지 조금 알 수 있습니다 재생 중

우리가 어떻게 커스터마이즈 할 수 있는지에 대해 조금 이야기 해 봅시다 그 내부 행동 Andrew가 이전에 보여준 코드 조각입니다 우리는 ExoPlayerFactory로 ExoPlayer를 만들고 있습니다 그러나 실제로는 더 복잡한 방법이 있습니다

ExoPlayer 생성을위한 것입니다 그리고 당신은 우리가이 플레이어에 주입하고있는 것을 볼 수 있습니다 인스턴스는 정확히 우리가 방금 구성한 구성 요소입니다 그런데 렌더러, TrackSelector, 및 LoadControl 여기에서는 기본 구현을 삽입하는 것입니다

그럼 우리가 어떻게 플레이어를 잡아 당겨 미세 조정할 수 있는지 살펴 보겠습니다 그 중 하나 이제 LoadControl을 살펴 보겠습니다 여기에서는 여전히 기본 구현을 사용하고 있습니다 그러나 실제로 생성자에 변수를 전달할 수 있습니다

그 행동을 조작하는 것 그래서이 기본 LoadControl은 말하고있다 그것은 버퍼에서 15 ~ 30 초 사이에 원하는, 다음과 같은 경우 재생을 시작하려고합니다 25 초가 버퍼됩니다

그렇다면 그 점이 어떤면에서 보입니까? 벽 시계 시간 대 지속 시간 의 미디어가 버퍼에 있습니까? 버퍼가 채워지기 시작합니다 25 초가 지나면 재생이 시작됩니다 작은 오렌지색 점으로 표시됩니다 LoadControl을 사용하면 버퍼링을 계속할 수 있습니다

30 초 버퍼링은 잠시 꺼집니다 그리고 MediaSource 버퍼가 줄어들 것입니다 ~ 15 초이며, 이는 하한입니다 그리고 버퍼링은 다시 켜집니다

그래서 이런 종류의 톱니 패턴을 얻습니다 버퍼링 동작의 측면에서 그래서이 시점에서 분명히 분명합니다 당신은이 행동에 실제로 영향을 줄 수 있습니다 이 번호를 15에서 25로 변경할 수 있습니다

버퍼 허용에 익숙하지 않은 경우 저기를 배수한다 우리는 기본 LoadControl의 작동 방식을 이해했기 때문에, 우리는 새로운 그래프를 보여줄 수 있습니다 그래서 여기서 버퍼는 모든 점에서 더 충만하게 유지됩니다 재생 중 그리고 버퍼링은 훨씬 더 자주 켜고 끕니다

우리가 원하는 걸 결정할 수도 있어요 재생을 시작할 때보다 보수적 인 태도를 취할 수 있습니다 그래서 우리는 값을 25 초에서 10 초로 늘립니다 그리고 우리는 그 차이를 이해할 수 있습니다

이 그래프의 관점에서 이제 수정 된 기본 LoadControl을 사용할 수 있습니다 다시 플레이어에 주입하십시오 그래서 LoadControl이 아니라면? 원하는 실제 버퍼링 정책에 충분히 유연합니까? 그럼 당신은 더 나아갈 수 있습니다 독자적인 LoadControl을 처음부터 구현하십시오

그래서 당신이 가진 방법 중 하나 이것을 구현하면 shouldContinueLoading이라고 불린다 부울을 반환합니다 재생 중에 폴링됩니다 그리고 이것은 정확히 방법입니다 실제로 MediaSource가 버퍼링하는지 여부를 제어합니다

그리고 모든 종류의 행동과 논리를 구현할 수 있습니다 자신의 구현에서 TrackSelector에서도 비슷한 일을 할 수 있습니다 그래서이 경우 실제로 매개 변수를 얻을 수 있습니다 우리는 기본값을 조작 할 수 있습니다

TrackSelector는 실제로 트랙을 선택합니다 여기서는 비디오 트랙을 SD로 제한하고 있으므로 480p입니다 그리고 귀하의 사용자가 귀하의 측정 된 모바일 연결에서 그리고 대역폭이 정말 큰 경우에도, 당신은 아마 그들의 데이터 전부를 아주 빨리 사용하고 싶지 않을 것입니다 품질에 대한 상한선을 유지하고 싶을 수도 있습니다 당신이 제공하는 것

마찬가지로 사용자가 독일어 인 경우, 케이스에 대해 선호하는 오디오 언어를 선택할 수 있습니다 노출 된 오디오 트랙이 여러 개있는 경우 MediaSource에 의해 그리고 매개 변수를 다시 수정할 수 있습니다 선택기에서이 새로운 비헤이비어를 실제로 활성화하십시오 또, TrackSelector의 디폴트 구현 적합하지 않다면 한 단계 더 나아가 구현할 수 있습니다 자신의 TrackSelector

구현해야하는 방법 중 하나 이렇게하면 selectTracks입니다 그리고이 메소드의 서명을 매핑하면된다 이전에 본 다이어그램으로 돌아갑니다 렌더러의 기능을 받고 있습니다 그리고 MediaSource의 TrackGroups, 선택을 생성합니다

물론 같은 트릭을 적용 할 수 있습니다 렌더러에 대해서도 마찬가지입니다 자신 만의 VideoRenderer를 처음부터 구현하기 꽤 고급 사용자 정의입니다, 정말로 원한다면 할 수 있어요 그리고 너는 정확히 너를 잘 처리 해준다 그것을 달성하기 위해해야합니다

그리고 기본 RenderersFactory를 확장 할 수 있습니다 buildVideoRenderers 메소드를 오버라이드 (override) 해, 실제로 자신의 VideoRenderer를 플레이어에 삽입하십시오 일반적으로 생성되는 기본값 대신 앤드루 루이스 : 좋아, 좋아 잘하면 당신은 신흥 패턴을 볼 수 있습니다

맞춤 설정의 각 예에서 저것은 대략 말했다 그래서 첫 번째 단계는 플레이어의 어떤 구성 요소를 사용자 정의해야하는지, TrackSelector이든 LoadControl이든 상관 없습니다 그런 다음 해당 구성 요소의 API를 살펴 봅니다 사용하여 행동을 사용자 정의 할 수있는 방법이 있는지 확인하십시오 말하자면, LoadControl에서했던 것처럼 다른 매개 변수입니다

그게 가능하지 않다면, 당신은 확장 할 수도 실제로 할 수도있다 이 구성 요소의 자체 버전을 처음부터 구현하십시오 그래서 저는 이제 더 많은 커스터마이징 예제를 할 것입니다 이번 MediaSource 쪽에서 그러므로 우리가 승인서를 보내야한다고 상상해보십시오

헤더는 MediaSource가 만드는 각 HTTP 요청을 포함합니다 글쎄, 우리는 우리가 지나가고 있다는 것을 안다 HttpDataSourceFactory에서 그리고 이것은 기본 요청을 얻는 편리한 방법을 가지고있다 속성

그리고 기본 요청 속성을 가져 와서, 우리는 실제로 새로운 헤더를 설정하여 인증 헤더를 설정할 수 있습니다 HTTP 요청에서 일단 그렇게하면 httpDataSourceFactory를 전달합니다 MediaSource에 넣습니다 그리고 그 헤더는 모든 요청에 ​​나타납니다

다른 예를 들어 보겠습니다 사용자가 동영상을 꽤 많이 되 감을 것이라는 것을 알고, 그래서 플레이어가 캐시를 추가하지 않도록 캐시를 추가하려고합니다 반복적으로 동일한 미디어를 네트워크에서로드합니다 ExoPlayer는 당신이 사용할 수있는 간단한 캐시를 가지고 있습니다 이 예에서는 LeastRecentlyUsedCacheEvictor

이것이 작동하게되는 방식은 캐시에는 최대 크기가 있습니다 하지만 미디어가 그보다 더 길다면 미디어가 끝나면 미디어를 완전히 보았다 캐시는 실제로 그것의 시작 부분을 제거하기 시작했다 따라서이 캐시는 CacheDataSourceFactory로 전달됩니다 또한 일반 데이터 소스를 가져와야합니다

캐시 미스가 있고 캐시를 채우는 데 사용됩니다 그리고 CacheDataSourceFactory를 전달합니다 ExtractorMediaSource 이렇게 조금이라도 더 분명하게 보이기를 바랍니다 플레이어와 어떻게 어울리는 지 보자

이전에 우리가 보았던 아키텍처 이 캐시는 실제로 MediaSource 사이에 앉을 것입니다 및 HttpDataSource 그리고 MediaSource가 데이터를 요청할 때, 처음에는 캐시에서 찾아 볼 것입니다 캐시 미스가 있으면 네트워크로 연결됩니다

HttpDataSource를 사용하십시오 그런 다음 요청이 만족되면 그것은 다시 돌아와 캐시를 채울 것입니다 다음에 MediaSource가 요청할 때 같은 덩어리, 그러면 캐쉬에있을거야 그래서 극단적 인 경우의 종류에 대해 이야기했습니다 맞춤 설정으로 MediaSource 제공 또는 귀하가 구현 한 모든 것

그래서 나는 그것을하는 예제를 통해 갈 것입니다 앱을 가지고 있다고 가정 해 보겠습니다 일부 콘텐츠를 보여 주지만 이제는 광고를 나란히 게재하여 해당 콘텐츠에서 수익을 창출하고 싶습니다 타임 라인의 진행 상황에 대해 생각해 봅시다 이 경우와 같이 보입니다

글쎄, 그것은 매우 간단합니다 이 예에서는 화면에 첫 번째 광고는 프리 롤 광고입니다 아니면 더 복잡 할 수도 있습니다 이 경우 프리 롤 광고가 있습니다 미드 롤 광고 및 포스트 롤 광고에 게재됩니다

그리고 그들은 일종의 내용을 나누었습니다 그래서 언뜻 생각하면 이것은 ConcatenatingMediaSource를 사용할 수있는 곳입니다 하지만 불행히도 일반적으로 광고를로드 할 때, 특정 광고 URI에 실제로 커밋 할 수는 없습니다 때까지 당신이 그것을 재생하려고합니다 Google에서 정확히 어떤 광고가 있는지는 알 수 없습니다

우리는 선전 할 것입니다 그럼 우리가 시도하면 어떻게되는지 보자 기존 MediaSources에서 단 한 명의 플레이어 만 사용하는 방법 이러한 광고를 재생합니다 그래서 재생 시작 부분에 URI가 있습니다 첫 번째 광고를 게재 한 다음 재생할 수 있습니다

그러나 우리는 우리가 그 내용을 재생할 필요가 있음을 안다 그래서 플레이어는 실제로 버퍼링하려고합니다 우리가 대신 콘텐츠를 재생하고 싶다고 말하면됩니다 그런 다음 콘텐츠가 재생되고 사용자가 다시 버퍼링을 볼 것입니다 그런 다음 광고, 더 많은 버퍼링 및 이것이 어떻게 작동 할 것인지 말하고있는 것 같습니다

버퍼링이 많이 있습니다 그리고 이것은 좋은 사용자 경험이 아닙니다 사람들이이 문제를 해결하기 위해 노력하는 한 가지 방법 그들은 두 명의 플레이어를 사용하려고 시도 할 것입니다 그리고 그 아이디어는 한 선수가 현재 화면에있는 것을 재생하려고합니다 다른 플레이어는 백그라운드에서 버퍼링을합니다

다음에 올거야 따라서 광고 URI가 도착하자마자 배경 플레이어를 채울 수 있습니다 잘하면 일부 데이터를 버퍼링 할 수 있습니다 재생이 시작되기 전에 그리고이 경우 재생은 광고와 콘텐츠 사이를 전환하십시오

그러나이 솔루션에는 단점도 있습니다 이 두 플레이어는 모두 버퍼링을 위해 메모리를 사용합니다 동시에 코덱을 사용할 수도 있습니다 그렇게 좋지는 않습니다 그리고 이것은 또한 매우 어렵습니다

당신이 이것을 시도한 적이 있다면 올바르게 구현할 수 있습니다 그래서 우리는 MediaSource를 구현하려고 생각했습니다 특별히 광고용으로 설계되었습니다 그리고이 MediaSource가 구현되었습니다 연결 미디어 소스와 약간 비슷한 방식으로, 단,이 재생 목록 항목은 다음과 같습니다

채워지지 않습니다 그리고 그것들은 물음표로 표시됩니다 그것들은 광고들로 채워질 것입니다 그들이 도착하자마자 그럼 재생이 어떻게 보이는지 봅시다

이 가설적인 MediaSource와 같습니다 재생이 시작되고 첫 번째 광고가 표시됩니다 그런 다음 콘텐츠가 재생됩니다 바라건대 우리는 조금 더 일찍 다음 광고를 얻습니다 그 자리 표시자는 타임 라인에 채워집니다

그리고 이것이 잘 작동하면 사용자 실제로 재생하는 동안 어떤 버퍼링도 보지 않을 것입니다 그래서 이것의 실질적인 예로서, Google은 InteractiveMediaAds SDK를 제공합니다 너는 그것을 들었을지도 모른다 그리고 우리는이 ImaAdsMediaSource에서 광고를로드하는 데 이것을 사용하고 있습니다 보시다시피, 지역 종류의 광고가 IMA에서로드 될 때 강조 표시됩니다

그리고 미디어 소스가 IMA를 래핑하고 있습니다 그래서 플레이어는 게임의 세부 사항에 대해 걱정할 필요가 없습니다 광고가 실제로로드됩니다 이 타임 라인에서 원활한 전환 효과를 얻을 수 있습니다 콘텐츠와 광고 사이

그래서 우리는 이것을 실제로 개발 브랜치로 밀어 넣었습니다 오늘 미리 미리보기를 원한다면 콘텐츠에 광고를 삽입하려는 경우 사용하기가 매우 쉽습니다 그래서 당신은 당신의 콘텐츠를 가져 간다 MediaSource 당신은 그것을 구조에 전달합니다 ImaAdsMediaSource를 정의하는 adTagUri와 함께 로드 할 광고 재생 목록 또한 OverlayViewGroup을 사용합니다

어떤 양방향 미디어 광고가 사용할 것인가 플레이어 상단에 광고 사용자 인터페이스를 표시하는 방법 예를 들어 건너 뛰기 버튼처럼 이 일을 시도하면 얻을 수있는 것이 있습니다 프리 롤 광고가 재생중인 것을 볼 수 있습니다 광고가 끝나면 광고 간 전환이 아주 원활하다 콘텐츠로 또한 재생 컨트롤에 지원 기능이 있음을 알 수 있습니다

광고 마커가 거의 표시되지 않도록 사용자가 미드 롤 광고의 위치를 ​​확인하십시오 그리고이 재생 중에 일관된 버퍼링 정책이 항상 적용됩니다 이제 우리의 미래 계획에 대해 이야기하기 위해 다시 Ollie로 돌아 가자 올리버 우먼 : 우리가 너를 떠나기 전에, 나는 방향에 대해 조금 말하고 싶다 ExoPlayer가 향합니다

이것에주의를 기울이는 것만으로도 이것은 약속이 될 수 없습니다 우리는 어떤 것에도 타임 라인을 넣지 않을 것입니다 그러나 사물의 측면에서 우리가 앞으로 6 개월 동안보고있을 것입니다 1 년, 우리는 계속 될 것입니다 나머지 기능 틈을 채우기 위해 우리가 정말로 완전 해지는 관점에서 미디어 재생 라이브러리

우리가 아는 하나의 구체적인 것은 당신을 많이 일으키는 것입니다 문제는 오프라인에 대한 적절한 지원입니다 그래서 이것이 실제로 다운로드하는 곳입니다 미디어를 나중에 재생할 수 있습니다 그래서 우리는 우리가 시작하기를 기대할 수 있습니다

향후 6 개월 동안 오프라인 지원 구축 ~ 1 년 우리는 또한 계속 일할 것입니다 향상된 성능 그리고 그것은 디코더 인스턴스를 유지하는 것과 같은 것을 의미합니다 한 재생에서 다음 재생으로 플랫폼에서, 해제 및 인스턴스화 우리가 지금하는 것처럼 그 디코더는 꽤 비쌀 수 있습니다

살펴볼 성능의 또 다른 측면 DASH 및 HLS를위한 향상된 적응 형 트랙 선택입니다 SmoothStreaming 적응 형 재생 및 고급 버퍼링 정책 따라서 현재 우리가 사용하는 기본 구성 요소 이러한 작업을 수행하기 위해 제공, 그들은 꽤 효과적이지만 그들은 그들이 구현하는 정책면에서 아주 간단합니다 그래서 우리는 좀 더 깊이 잠수하기를 정말로 원합니다 적절한 연구와 종류를하고 더 나은 성능을 내기 위해 이들을 미세 조정하는 방법 상자의 마지막으로 우리는 ExoPlayer API가 매우 큰 것을 알고 있습니다

시작하기에 어려울 수 있음을 다이빙이 필요한 곳을 정확히 알아 내기 위해 뭔가를 사용자 정의하고 싶습니다 그래서 우리는 더 나은 문서화 작업을 할 것입니다 아마도 문서화로 시작한다 플레이어가 가지고있는 내부 구성 요소의 일부 사용했다 ExoPlayer로 다음에 할 수있는 일의 관점에서 네가 여기있는 동안, 내일 근무할 시간이있어

아침 9시 30 분에 근무 시간대에 우리에게 질문이 있으시면 함께 오세요 우리는 채팅하고 답변을하는 것보다 더 행복 할 것입니다 우리 소스 코드를 살펴보고 싶다면, GitHub 저장소는 공개되어 있으므로 가서 살펴볼 수 있습니다 그리고 우리는 또한 홈 페이지를 가지고 있습니다

시작하는 데 도움이되는 개발자 가이드가 포함되어 있습니다 또한 다양한 문서가 있습니다 지원되는 형식 등 그리고 그걸로와 주셔서 감사합니다 불행히도 지금은 질문 할 시간이 없습니다

그러나 우리는 아마 이후에 모퉁이에서 내려갈 것입니다 내가 말했듯이, 질문이 있으면 우리가 지금 대답 할 수없는, 제발 내일 아침에 너와 같이 갈거야 그들에게 행복하게 대답하십시오 시간 내 주셔서 대단히 감사합니다 [박수 갈채] [음악 재생]