当我使用 Java youtube api 上传视频时,是不是可以向视频添加注释或“结束屏幕”?

Posted

技术标签:

【中文标题】当我使用 Java youtube api 上传视频时,是不是可以向视频添加注释或“结束屏幕”?【英文标题】:Is possible to add annotations or a 'end screen' to a video when i'm uploading it using Java youtube api?当我使用 Java youtube api 上传视频时,是否可以向视频添加注释或“结束屏幕”? 【发布时间】:2018-03-24 15:42:50 【问题描述】:

为了生成我的代码,我修改了从 google 放在 gitHub 上的示例。

一切正常,视频上传没有问题,但现在我需要在我的视频中添加一些注释或“结束屏幕”,因为我需要在用户看到我的“视频预览”后将他们重定向到我的网站。

所以,工作流程是这样的:

1) 用户从 jsp 页面插入标题和描述。

2) 当他点击按钮时,软件会获取存储在我的数据库中的用户凭据,然后将所有参数传递给我在下面发布的方法。

3) 班级将视频上传到 YouTube。

现在我的问题是: 有一种简单的方法可以将我的链接“附加”到上传的视频?

我应该在视频区域使用注释、号召性用语或任何类型的叠加消息/按钮。

叠加层是在整个视频时长中持续存在还是仅在视频结尾出现都没有关系。

我希望有人可以帮助我! 我希望谷歌能以更好的方式重写文档,因为我为实现 YouTube 的 API 变得疯狂。

这是我源代码的sn-p:

    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's 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's 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();
    

【问题讨论】:

【参考方案1】:

不幸的是,这是不可能的,据我所知也不会。

无法添加注释是一种预期行为。请参阅此链接:https://issuetracker.google.com/issues/35166657 - 状态:无法修复(预期行为)

显然最好的选择是视频内编程,但我认为这不适合您的目的,除非它可以是特定于视频的。

【讨论】:

非常感谢mutch!我已经放弃了这项工作,但我很高兴有人回答了我的问题!无论如何......我在互联网上找到了同样的东西,各种号召性用语都被弃用了!所以如果有人试图做同样的事情,那似乎是不可能的!

以上是关于当我使用 Java youtube api 上传视频时,是不是可以向视频添加注释或“结束屏幕”?的主要内容,如果未能解决你的问题,请参考以下文章

Youtube API 上传视频大小和长度限制

使用 YouTube Data API v3 确定 YouTube 频道的上传速率

Youtube 上传 api 套接字超时

收听 Youtube 上传事件 Java

Youtube data api v3 按特定频道搜索所有上传和发布的视频

youtube-v3-api 频道列表错误