refactor(ffmpeg): use r_frame_rate for FPS (#41)
* refactor(ffmepg): use r_frame_rate for FPS * reset golden * fix * test: update golden files
This commit is contained in:
parent
fe92e79efc
commit
654251e693
48 changed files with 60 additions and 65 deletions
10
README.md
10
README.md
|
|
@ -49,18 +49,13 @@ http://localhost:8000/unsafe/300x0/7x7/filters:max_frames(70):fill(yellow)/http:
|
|||
|
||||
### Metadata
|
||||
|
||||
imagorvideo provides metadata endpoint that extracts video metadata, dimension and duration data. By default, it only process the header without extracting the frame data for better processing speed.
|
||||
imagorvideo provides metadata endpoint that extracts video metadata, including dimension, duration and FPS data. The endpoint only processes the header without extracting the frame data.
|
||||
|
||||
To use the metadata endpoint, add `/meta` right after the URL signature hash before the image operations:
|
||||
|
||||
```
|
||||
http://localhost:8000/unsafe/meta/https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_30MB.mp4
|
||||
```
|
||||
Appending the `max_frames()` or `frame(n)` filter however, would activate frame processing. This results more processing time but would also allows retrieving frame related info such as frames per second `fps`:
|
||||
|
||||
```
|
||||
http://localhost:8000/unsafe/meta/filters:max_frames()/https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_30MB.mp4
|
||||
```
|
||||
|
||||
```jsonc
|
||||
{
|
||||
|
|
@ -72,13 +67,12 @@ http://localhost:8000/unsafe/meta/filters:max_frames()/https://test-videos.co.uk
|
|||
"height": 1080,
|
||||
"title": "Big Buck Bunny, Sunflower version",
|
||||
"artist": "Blender Foundation 2008, Janus Bager Kristensen 2013",
|
||||
"fps": 30, // available only if frame processing activated
|
||||
"fps": 30,
|
||||
"has_video": true,
|
||||
"has_audio": false
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### Configuration
|
||||
|
||||
Configuration options specific to imagorvideo. Please see [imagor configuration](https://github.com/cshum/imagor#configuration) for all existing options available.
|
||||
|
|
|
|||
|
|
@ -133,8 +133,8 @@ func (av *AVContext) Close() {
|
|||
|
||||
func (av *AVContext) Metadata() *Metadata {
|
||||
var fps float64
|
||||
if av.availableDuration > 0 {
|
||||
fps = float64(av.availableIndex) * float64(time.Second) / float64(av.availableDuration)
|
||||
if av.stream != nil {
|
||||
fps = float64(av.stream.r_frame_rate.num) / float64(av.stream.r_frame_rate.den)
|
||||
}
|
||||
return &Metadata{
|
||||
Orientation: av.orientation,
|
||||
|
|
@ -143,7 +143,7 @@ func (av *AVContext) Metadata() *Metadata {
|
|||
Height: av.height,
|
||||
Title: av.title,
|
||||
Artist: av.artist,
|
||||
FPS: math.Round(fps*10) / 10,
|
||||
FPS: fps,
|
||||
HasVideo: av.hasVideo,
|
||||
HasAudio: av.hasAudio,
|
||||
}
|
||||
|
|
|
|||
19
processor.go
19
processor.go
|
|
@ -114,6 +114,15 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp
|
|||
return
|
||||
}
|
||||
defer av.Close()
|
||||
meta := av.Metadata()
|
||||
if params.Meta {
|
||||
out = imagor.NewBlobFromJsonMarshal(Metadata{
|
||||
Format: strings.TrimPrefix(mime.Extension(), "."),
|
||||
ContentType: mime.String(),
|
||||
Metadata: meta,
|
||||
})
|
||||
return
|
||||
}
|
||||
bands := 3
|
||||
for _, filter := range params.Filters {
|
||||
switch filter.Name {
|
||||
|
|
@ -148,15 +157,7 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp
|
|||
}
|
||||
}
|
||||
}
|
||||
meta := av.Metadata()
|
||||
if params.Meta {
|
||||
out = imagor.NewBlobFromJsonMarshal(Metadata{
|
||||
Format: strings.TrimPrefix(mime.Extension(), "."),
|
||||
ContentType: mime.String(),
|
||||
Metadata: meta,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
switch meta.Orientation {
|
||||
case 3:
|
||||
filters = append(filters, imagorpath.Filter{Name: "orient", Args: "180"})
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":9.8,"has_video":true,"has_audio":false}
|
||||
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"has_video":true,"has_audio":false}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":12040,"width":720,"height":576,"has_video":true,"has_audio":false}
|
||||
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"has_video":true,"has_audio":false}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30.1,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":1.2,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":16,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":7407,"width":640,"height":480,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/macabre.mp4-5.meta.json
vendored
2
testdata/golden/meta/macabre.mp4-5.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/macabre.mp4.meta.json
vendored
2
testdata/golden/meta/macabre.mp4.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":3925,"width":492,"height":360,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/schizo.flv-10.meta.json
vendored
2
testdata/golden/meta/schizo.flv-10.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":27.9,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/schizo.flv-5.meta.json
vendored
2
testdata/golden/meta/schizo.flv-5.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":25.6,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.6,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.3,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/schizo.flv.meta.json
vendored
2
testdata/golden/meta/schizo.flv.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2560,"width":480,"height":360,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/schizo_0.mp4.meta.json
vendored
2
testdata/golden/meta/schizo_0.mp4.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":3,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true}
|
||||
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":6,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true}
|
||||
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
2
testdata/golden/meta/schizo_90.mp4.meta.json
vendored
2
testdata/golden/meta/schizo_90.mp4.meta.json
vendored
|
|
@ -1 +1 @@
|
|||
{"orientation":8,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true}
|
||||
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":1906,"width":1280,"height":720,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":1906,"width":1280,"height":720,"fps":90000,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":1906,"width":1280,"height":720,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":1906,"width":1280,"height":720,"fps":90000,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":1906,"width":1280,"height":720,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":1906,"width":1280,"height":720,"fps":90000,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":1906,"width":1280,"height":720,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":1906,"width":1280,"height":720,"fps":90000,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"orientation":1,"duration":1906,"width":1280,"height":720,"has_video":true,"has_audio":true}
|
||||
{"orientation":1,"duration":1906,"width":1280,"height":720,"fps":90000,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"has_video":true,"has_audio":true}
|
||||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"has_video":true,"has_audio":true}
|
||||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
|
|
@ -1 +1 @@
|
|||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":29.9,"has_video":true,"has_audio":true}
|
||||
{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":29.97002997002997,"has_video":true,"has_audio":true}
|
||||
Loading…
Add table
Add a link
Reference in a new issue