我一直在尝试 GCP 的Transcoder API并且在某些情况下随机变得比指定的时间更短时遇到了麻烦。
具体情况如下:
- 指定
startTimeOffset
和endTimeOffset
(在视频前后截断2秒) - fMP4 用作容器
- 输入视频是 mp4 并在 iPad Pro 上进行屏幕录制
例如,如果我不指定startTimeOffset
and endTimeOffset
,则时间不会缩短。此外,当为容器指定 MPEG2-TS 时也没有问题。视频本身可能有问题,但我还没有找到如何设置的线索。
我不确定这是 Transcoder API 的问题还是我的问题。
测试输入视频:https ://gofile.io/d/DUT9rr
❯ ffprobe input.mp4
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.28)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: isommp41mp42
creation_time : 2021-02-26T15:08:58.000000Z
Duration: 00:02:51.15, start: 0.000000, bitrate: 551 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 246 kb/s (default)
Metadata:
creation_time : 2021-02-26T15:08:58.000000Z
handler_name : Core Media Audio
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709/bt709/iec61966-2-1), 1920x1342, 302 kb/s, 12.39 fps, 120 tbr, 600 tbn, 1200 tbc (default)
Metadata:
rotate : 180
creation_time : 2021-02-26T15:08:58.000000Z
handler_name : Core Media Video
Side data:
displaymatrix: rotation of -180.00 degrees
#!/bin/bash -eu
cat > request.json << EOF
{
"config": {
"inputs": [
{
key: "input0"
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0"
],
"startTimeOffset": "2s",
"endTimeOffset": "169s",
},
],
"elementaryStreams": [
{
"videoStream": {
"codec": "h265",
"heightPixels": 480,
"bitrateBps": 1200000,
"rateControlMode": "vbr",
"enableTwoPass": true,
"frameRate": 30,
"crfLevel": 31,
"gopDuration": "3.0s",
},
"key": "h265-stream0"
},
{
"videoStream": {
"codec": "h265",
"heightPixels": 720,
"bitrateBps": 1550000,
"rateControlMode": "vbr",
"enableTwoPass": true,
"frameRate": 30,
"crfLevel": 31,
"gopDuration": "3.0s",
},
"key": "h265-stream1"
},
{
"videoStream": {
"codec": "h265",
"heightPixels": 1080,
"bitrateBps": 2600000,
"rateControlMode": "vbr",
"enableTwoPass": true,
"frameRate": 30,
"crfLevel": 31,
"gopDuration": "3.0s",
},
"key": "h265-stream2"
},
{
"audioStream": {
"codec": "aac",
"bitrateBps": 64000,
"channelCount": 2,
"channelLayout": [
"fl",
"fr"
],
"sampleRateHertz": 48000
},
"key": "audio-stream0"
},
],
"muxStreams": [
{
"key": "media-sd",
"fileName": "media-sd.m4s",
"container": "fmp4",
"elementaryStreams": [
"h265-stream0",
],
"segmentSettings": {
"individualSegments": true
},
},
{
"key": "media-hd",
"fileName": "media-hd.m4s",
"container": "fmp4",
"elementaryStreams": [
"h265-stream1",
],
"segmentSettings": {
"individualSegments": true
},
},
{
"key": "media-fhd",
"fileName": "media-fhd.m4s",
"container": "fmp4",
"elementaryStreams": [
"h265-stream2",
],
"segmentSettings": {
"individualSegments": true
},
},
{
"key": "audio-only",
"fileName": "audio-only.m4s",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
],
"segmentSettings": {
"individualSegments": true
},
},
],
"manifests": [
{
"fileName": "manifest-h265.mpd",
"type": "DASH",
"muxStreams": [
"media-sd",
"media-hd",
"media-fhd",
"audio-only",
]
},
]
}
}
EOF
curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://transcoder.googleapis.com/v1beta1/projects/MY_PROJECT/locations/asia-east1/jobTemplates?jobTemplateId=test-template
#!/bin/bash -eu
cat > request.json << EOF
{
"inputUri": "gs://my-bucket/input.mp4",
"outputUri": "gs://my-bucket/output/",
"templateId": "test-template"
}
EOF
curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://transcoder.googleapis.com/v1beta1/projects/MY_PROJECT/locations/asia-east1/jobs
以下是生成的清单文件的 ffprobe,比指定的短 2 秒。(预期:00:02:47.00
,实际:)00:02:45.00
在这种情况下,它是 2 秒的间隙,但可以是 10 秒或 30 秒,并且因视频而异。
❯ ffprobe manifest-h265.mpd
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.28)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
Input #0, dash, from 'manifest-h265.mpd':
Duration: 00:02:45.00, start: 0.000000, bitrate: 0 kb/s
Program 0
Stream #0:0: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 686x480, 112 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
Metadata:
variant_bitrate : 113679
id : 113679
Stream #0:1: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 1030x720, 205 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
Metadata:
variant_bitrate : 189219
id : 189219
Stream #0:2: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 1544x1080, 384 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
Metadata:
variant_bitrate : 358043
id : 358043
Stream #0:3: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 65 kb/s
Metadata:
variant_bitrate : 70245
id : 70245
以下是为 h264 + MPEG2-TS + Apple HLS 指定的时间。
❯ ffprobe manifest-h264.m3u8 | pbcopy
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.28)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
[hls @ 0x7fe23100f200] Opening 'h264-sd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-hd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-fhd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-sd0000000000.ts' for reading
[hls @ 0x7fe23100f200] Opening 'h264-hd0000000000.ts' for reading
[hls @ 0x7fe23100f200] Opening 'h264-fhd0000000000.ts' for reading
Input #0, hls, from 'manifest-h264.m3u8':
Duration: 00:02:47.00, start: 0.000000, bitrate: 0 kb/s
Program 0
Metadata:
variant_bitrate : 511576
Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 686x480, 120 tbr, 90k tbn, 2000k tbc
Metadata:
variant_bitrate : 511576
Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
Metadata:
variant_bitrate : 511576
Program 1
Metadata:
variant_bitrate : 793711
Stream #0:2: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1030x720, 120 tbr, 90k tbn, 2000k tbc
Metadata:
variant_bitrate : 793711
Stream #0:3: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
Metadata:
variant_bitrate : 793711
Program 2
Metadata:
variant_bitrate : 1305288
Stream #0:4: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1544x1080, 120 tbr, 90k tbn, 2000k tbc
Metadata:
variant_bitrate : 1305288
Stream #0:5: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
Metadata:
variant_bitrate : 1305288