Detect explicit content in videos

Explicit Content Detection detects adult content in videos. Adult content is generally inappropriate for those under under 18 years of age and includes, but is not limited to, nudity, sexual activities, and pornography. Such content detected in cartoons or anime is also identified.

The response includes a bucketized likelihood value, from VERY_UNLIKELY to VERY_LIKELY.

When Explicit Content Detection evaluates a video, it does so on a per-frame basis and considers visual content only. The audio component of the video is not used to evaluate explicit content level.

Here is an example of performing video analysis for Explicit Content Detection features on a file located in Cloud Storage.

REST

Send video annotation request

The following shows how to send a POST request to the videos:annotate method. The example uses the Google Cloud CLI to create an access token. For instructions on installing the gcloud CLI, see the Video Intelligence API Quickstart.

Before using any of the request data, make the following replacements:

  • INPUT_URI: a Cloud Storage bucket that contains the file you want to annotate, including the file name. Must start with gs://.
    For example: "inputUri": "gs://cloud-videointelligence-demo/assistant.mp4",
  • PROJECT_NUMBER: The numeric identifier for your Google Cloud project

HTTP method and URL:

POST https://videointelligence.googleapis.com/v1/videos:annotate

Request JSON body:

{
 "inputUri": "INPUT_URI",
 "features": ["EXPLICIT_CONTENT_DETECTION"]
}

To send your request, expand one of these options:

curl (Linux, macOS, or Cloud Shell)

Save the request body in a file named request.json, and execute the following command:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_NUMBER" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://videointelligence.googleapis.com/v1/videos:annotate"

PowerShell (Windows)

Save the request body in a file named request.json, and execute the following command:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_NUMBER" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://videointelligence.googleapis.com/v1/videos:annotate" | Select-Object -Expand Content

You should receive a JSON response similar to the following:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/operations/OPERATION_ID"
}

If the response is successful, the Video Intelligence API returns the name for your operation. The above shows an example of such a response, where:

  • PROJECT_NUMBER: the number of your project.
  • LOCATION_ID: the Cloud region where annotation should take place. Supported cloud regions are: us-east1, us-west1, europe-west1, asia-east1. If no region is specified, a region will be determined based on video file location.
  • OPERATION_ID: the ID of the long running operation created for the request and provided in the response when you started the operation, for example 12345...

Get annotation results

To retrieve the result of the operation, make a GET request, using the operation name returned from the call to videos:annotate, as shown in the following example.

Before using any of the request data, make the following replacements:

  • OPERATION_NAME: the name of the operation as returned by Video Intelligence API. The operation name has the format projects/PROJECT_NUMBER/locations/LOCATION_ID/operations/OPERATION_ID
  • PROJECT_NUMBER: The numeric identifier for your Google Cloud project

HTTP method and URL:

GET https://videointelligence.googleapis.com/v1/OPERATION_NAME

To send your request, expand one of these options:

curl (Linux, macOS, or Cloud Shell)

Execute the following command:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_NUMBER" \
"https://videointelligence.googleapis.com/v1/OPERATION_NAME"

PowerShell (Windows)

Execute the following command:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_NUMBER" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://videointelligence.googleapis.com/v1/OPERATION_NAME" | Select-Object -Expand Content

You should receive a JSON response similar to the following:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/operations/OPERATION_ID",
 "metadata": {
 "@type": "type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress",
 "annotationProgress": [
 {
 "inputUri": "/demomaker/gbikes_dinosaur.mp4",
 "progressPercent": 100,
 "startTime": "2020-03-26T00:16:35.112404Z",
 "updateTime": "2020-03-26T00:16:55.937889Z"
 }
 ]
 },
 "done": true,
 "response": {
 "@type": "type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse",
 "annotationResults": [
 {
 "inputUri": "/demomaker/gbikes_dinosaur.mp4",
 "explicitAnnotation": {
 "frames": [
 {
 "timeOffset": "0.056149s",
 "pornographyLikelihood": "VERY_UNLIKELY"
 },
 {
 "timeOffset": "1.166841s",
 "pornographyLikelihood": "VERY_UNLIKELY"
 },
 ...
 {
 "timeOffset": "41.678209s",
 "pornographyLikelihood": "VERY_UNLIKELY"
 },
 {
 "timeOffset": "42.596413s",
 "pornographyLikelihood": "VERY_UNLIKELY"
 }
 ]
 }
 }
 ]
 }
 }
Shot detection annotations are returned as a shotAnnotations list. Note: The done field is only returned when its value is True. It's not included in responses for which the operation has not completed.

Download annotation results

Copy the annotation from the source to the destination bucket: (see Copy files and objects)

gcloud storage cp gcs_uri gs://my-bucket

Note: If the output gcs uri is provided by the user, then the annotation is stored in that gcs uri.

Go


funcexplicitContentURI(wio.Writer,filestring)error{
ctx:=context.Background()
client,err:=video.NewClient(ctx)
iferr!=nil{
returnerr
}
deferclient.Close()
op,err:=client.AnnotateVideo(ctx,&videopb.AnnotateVideoRequest{
Features:[]videopb.Feature{
videopb.Feature_EXPLICIT_CONTENT_DETECTION,
},
InputUri:file,
})
iferr!=nil{
returnerr
}
resp,err:=op.Wait(ctx)
iferr!=nil{
returnerr
}
// A single video was processed. Get the first result.
result:=resp.AnnotationResults[0].ExplicitAnnotation
for_,frame:=rangeresult.Frames{
offset,_:=ptypes.Duration(frame.TimeOffset)
fmt.Fprintf(w,"%s - %s\n",offset,frame.PornographyLikelihood.String())
}
returnnil
}

Java

To authenticate to Video Intelligence, set up Application Default Credentials. For more information, see Set up authentication for a local development environment.

// Instantiate a com.google.cloud.videointelligence.v1.VideoIntelligenceServiceClient
try(VideoIntelligenceServiceClientclient=VideoIntelligenceServiceClient.create()){
// Create an operation that will contain the response when the operation completes.
AnnotateVideoRequestrequest=
AnnotateVideoRequest.newBuilder()
.setInputUri(gcsUri)
.addFeatures(Feature.EXPLICIT_CONTENT_DETECTION)
.build();
OperationFuture<AnnotateVideoResponse,AnnotateVideoProgress>response=
client.annotateVideoAsync(request);
System.out.println("Waiting for operation to complete...");
// Print detected annotations and their positions in the analyzed video.
for(VideoAnnotationResultsresult:response.get().getAnnotationResultsList()){
for(ExplicitContentFrameframe:result.getExplicitAnnotation().getFramesList()){
doubleframeTime=
frame.getTimeOffset().getSeconds()+frame.getTimeOffset().getNanos()/1e9;
System.out.printf("Location: %.3fs\n",frameTime);
System.out.println("Adult: "+frame.getPornographyLikelihood());
}
}

Node.js

To authenticate to Video Intelligence, set up Application Default Credentials. For more information, see Set up authentication for a local development environment.

// Imports the Google Cloud Video Intelligence library
constvideo=require('@google-cloud/video-intelligence').v1;
// Creates a client
constclient=newvideo.VideoIntelligenceServiceClient ();
/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const gcsUri = 'GCS URI of video to analyze, e.g. gs://my-bucket/my-video.mp4';
constrequest={
inputUri:gcsUri,
features:['EXPLICIT_CONTENT_DETECTION'],
};
// Human-readable likelihoods
constlikelihoods=[
'UNKNOWN',
'VERY_UNLIKELY',
'UNLIKELY',
'POSSIBLE',
'LIKELY',
'VERY_LIKELY',
];
// Detects unsafe content
const[operation]=awaitclient.annotateVideo(request);
console.log('Waiting for operation to complete...');
const[operationResult]=awaitoperation.promise();
// Gets unsafe content
constexplicitContentResults=
operationResult.annotationResults[0].explicitAnnotation;
console.log('Explicit annotation results:');
explicitContentResults.frames.forEach(result=>{
if(result.timeOffset===undefined){
result.timeOffset={};
}
if(result.timeOffset.seconds===undefined){
result.timeOffset.seconds=0;
}
if(result.timeOffset.nanos===undefined){
result.timeOffset.nanos=0;
}
console.log(
`\tTime: ${result.timeOffset.seconds}`+
`.${(result.timeOffset.nanos/1e6).toFixed(0)}s`
);
console.log(
`\t\tPornography likelihood: ${likelihoods[result.pornographyLikelihood]}`
);
});

Python

For more information on installing and using the Cloud Video Intelligence API Client Library for Python, refer to Cloud Video Intelligence API Client Libraries.
"""Detects explicit content from the GCS path to a video."""
video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.Feature.EXPLICIT_CONTENT_DETECTION]
operation = video_client.annotate_video(
 request={"features": features, "input_uri": path}
)
print("\nProcessing video for explicit content annotations:")
result = operation.result(timeout=90)
print("\nFinished processing.")
# Retrieve first result because a single video was processed
for frame in result.annotation_results[0].explicit_annotation.frames:
 likelihood = videointelligence.Likelihood(frame.pornography_likelihood)
 frame_time = frame.time_offset.seconds + frame.time_offset.microseconds / 1e6
 print("Time: {}s".format(frame_time))
 print("\tpornography: {}".format(likelihood.name))

Additional languages

C#: Please follow the C# setup instructions on the client libraries page and then visit the Video Intelligence reference documentation for .NET.

PHP: Please follow the PHP setup instructions on the client libraries page and then visit the Video Intelligence reference documentation for PHP.

Ruby: Please follow the Ruby setup instructions on the client libraries page and then visit the Video Intelligence reference documentation for Ruby.

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025年11月06日 UTC.