Can I add annotations or the "end screen" to the video when I upload it using the Java youtube api?

To generate my code, I modified the samples posted from google to gitHub.

Everything is working fine and there’s no problem downloading the video, but now I need to add some annotations or an “end screen” to my videos because I need to redirect users to my site after they see my “preview video”.

So, the workflow looks something like this:

1) The user inserts a title and description from the jsp page.

2) When he clicks on the button, the software takes the credentials of the user stored in my database, and then passes all the parameters to the method indicated below.

3) the class uploads the video to YouTube.

Now my question is: is there an easy way to “attach” my links to the downloaded video?

I should use something like annotations, a call to action, or any type of overlay message / button in the video area.

It does not matter if the overlay is saved for the entire duration of the video or appears only at the end of the video.

Hope someone can help me! And I hope that Google will rewrite the documentation better, because I became crazy for implementing the YouTube API.

This is a piece of source code:

    public static void upload( String jsonString, String videoPath, String title , String description, String articleTags, HttpServletRequest request) {

    // This OAuth 2.0 access scope allows an application to upload files
    // to the authenticated user YouTube channel, but doesn't allow
    // other types of access.
    List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube.upload");

    try {

        // Authorize the request.
        JSONObject jsonObj = new JSONObject(jsonString);

        GoogleCredential credential = new GoogleCredential.Builder()
                                            .setClientSecrets(jsonObj.getString("client_id"), jsonObj.getString("client_secret"))
                                            .setJsonFactory(Auth.JSON_FACTORY).setTransport(Auth.HTTP_TRANSPORT).build()
                                            .setRefreshToken(jsonObj.getString("refresh_token")).setAccessToken(jsonObj.getString("access_token"));


        // This object is used to make YouTube Data API requests.
        youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).setApplicationName("virtual-cms-video-upload").build();

        System.out.println("Uploading: " + videoPath);

        // Add extra information to the video before uploading.
        Video videoObjectDefiningMetadata = new Video();

        // Set the video to be publicly visible. This is the default
        // setting. Other supporting settings are "unlisted" and "private."
        VideoStatus status = new VideoStatus();
        status.setPrivacyStatus("public");
        videoObjectDefiningMetadata.setStatus(status);



        // Most of the video metadata is set on the VideoSnippet object.
        VideoSnippet snippet = new VideoSnippet();

        // This code uses a Calendar instance to create a unique name and
        // description for test purposes so that you can easily upload
        // multiple files. You should remove this code from your project
        // and use your own standard names instead.
        snippet.setTitle      (title      );
        snippet.setDescription(description);



        if( !articleTags.trim().equals("") ){            

            // Set the keyword tags that you want to associate with the video.
            List<String> tags = new ArrayList<String>();

            for(int i = 0; i < articleTags.split(",").length ; i++){

                tags.add(articleTags);

            }

            snippet.setTags(tags);

            // Add the completed snippet object to the video resource.
            videoObjectDefiningMetadata.setSnippet(snippet);

        }

        //InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT,UploadYouTubeVideo.class.getClassLoader().getResourceAsStream(videoPath));
        InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT,new java.io.FileInputStream(new File(videoPath)));

        // Insert the video. The command sends three arguments. The first
        // specifies which information the API request is setting and which
        // information the API response should return. The second argument
        // is the video resource that contains metadata about the new video.
        // The third argument is the actual video content.
        YouTube.Videos.Insert videoInsert = youtube.videos().insert("snippet,statistics,status", videoObjectDefiningMetadata, mediaContent);

        // Set the upload type and add an event listener.
        MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();

        // Indicate whether direct media upload is enabled. A value of
        // "True" indicates that direct media upload is enabled and that
        // the entire media content will be uploaded in a single request.
        // A value of "False," which is the default, indicates that the
        // request will use the resumable media upload protocol, which
        // supports the ability to resume an upload operation after a
        // network interruption or other transmission failure, saving
        // time and bandwidth in the event of network failures.
        uploader.setDirectUploadEnabled(false);

        MediaHttpUploaderProgressListener progressListener = new MediaHttpUploaderProgressListener() {
            public void progressChanged(MediaHttpUploader uploader) throws IOException {
                switch (uploader.getUploadState()) {
                    case INITIATION_STARTED:
                        System.out.println("Initiation Started");
                        break;
                    case INITIATION_COMPLETE:
                        System.out.println("Initiation Completed");
                        break;
                    case MEDIA_IN_PROGRESS:
                        System.out.println("Upload in progress");
                        System.out.println("Upload percentage: " + uploader.getProgress());
                        break;
                    case MEDIA_COMPLETE:
                        System.out.println("Upload Completed!");
                        break;
                    case NOT_STARTED:
                        System.out.println("Upload Not Started!");
                        break;
                }
            }
        };

        uploader.setProgressListener(progressListener);

        // Call the API and upload the video.
        Video returnedVideo = videoInsert.execute();

        // Print data about the newly inserted video from the API response.
        System.out.println("\n================== Returned Video ==================\n");
        System.out.println("  - Id            : " + returnedVideo.getId()                       );
        System.out.println("  - Title         : " + returnedVideo.getSnippet().getTitle()       );
        System.out.println("  - Tags          : " + returnedVideo.getSnippet().getTags()        );
        System.out.println("  - Privacy Status: " + returnedVideo.getStatus().getPrivacyStatus());
        System.out.println("  - Video Count   : " + returnedVideo.getStatistics().getViewCount());

    } catch (Exception ex) {
        System.err.println("Throwable: " + ex.getMessage());
        ex.printStackTrace();
    }
}
+6
source share
1 answer

Unfortunately, this is impossible, and will never be, as far as I can tell.

- . . : https://issuetracker.google.com/issues/35166657 - : ( )

-, InVideo Programming, , , .

+3

All Articles