w3c / webcodecs

WebCodecs is a flexible web API for encoding and decoding audio and video.
https://w3c.github.io/webcodecs/
Other
978 stars 136 forks source link

seek is slower than video element #557

Closed shaozj closed 2 years ago

shaozj commented 2 years ago

I implemented seek based on webcodecs and mp4box.js. However, I found it's slower than video element's seek. My implementation is like follows:

  1. seek the demuxer to the key frame at-or-before time T
  2. reset() the decoder and decode from that key frame, continuing until you reach T
  3. discard decoder outputs until you get the frame at time T
  4. keep playing as usual

How can I imporve the speed of seek?

dalecurtis commented 2 years ago

Your logic seems correct and should mirror what we do internally in Chrome. This sounds like an implementation issue, so if this is Chromium please file a bug at https://crbug.com/new with a sample showing the issue.

shaozj commented 2 years ago

Is there any optimize in chrome internal video implementation?

dalecurtis commented 2 years ago

What you're doing sounds exactly the same as what we do internally. We don't have any "fast seek" type optimizations.

shaozj commented 2 years ago

I tested videodecoder's decode speed based on the sample of this repo. When seek a frame,the average decode time of one frame is about 5.8ms while video element seek the same frame, the average decode time is about 3ms. image Below is the decode time of each frame: video_renderer.js:187 decode one frame: 11.1611328125 ms video_renderer.js:187 decode one frame: 4.544921875 ms video_renderer.js:187 decode one frame: 10.2099609375 ms video_renderer.js:187 decode one frame: 8.322998046875 ms video_renderer.js:187 decode one frame: 5.948974609375 ms video_renderer.js:187 decode one frame: 9.981201171875 ms video_renderer.js:187 decode one frame: 5.3251953125 ms video_renderer.js:187 decode one frame: 4.513916015625 ms video_renderer.js:187 decode one frame: 8.51708984375 ms video_renderer.js:187 decode one frame: 1.554931640625 ms video_renderer.js:187 decode one frame: 11.172119140625 ms video_renderer.js:187 decode one frame: 2.76220703125 ms video_renderer.js:187 decode one frame: 9.85107421875 ms video_renderer.js:187 decode one frame: 0.974853515625 ms video_renderer.js:187 decode one frame: 7.581787109375 ms video_renderer.js:187 decode one frame: 1.807861328125 ms video_renderer.js:187 decode one frame: 8.35791015625 ms video_renderer.js:187 decode one frame: 0.408935546875 ms video_renderer.js:187 decode one frame: 8.677001953125 ms video_renderer.js:187 decode one frame: 5.39892578125 ms video_renderer.js:187 decode one frame: 6.968017578125 ms video_renderer.js:187 decode one frame: 4.7041015625 ms video_renderer.js:187 decode one frame: 5.518798828125 ms video_renderer.js:187 decode one frame: 3.56103515625 ms video_renderer.js:187 decode one frame: 7.47607421875 ms video_renderer.js:187 decode one frame: 1.835205078125 ms video_renderer.js:187 decode one frame: 6.14404296875 ms video_renderer.js:187 decode one frame: 5.453125 ms video_renderer.js:187 decode one frame: 7.18896484375 ms video_renderer.js:187 decode one frame: 2.56298828125 ms video_renderer.js:187 decode one frame: 4.876220703125 ms video_renderer.js:187 decode one frame: 2.831298828125 ms video_renderer.js:187 decode one frame: 7.431884765625 ms video_renderer.js:187 decode one frame: 0.201904296875 ms video_renderer.js:187 decode one frame: 8.0361328125 ms video_renderer.js:187 decode one frame: 7.545166015625 ms video_renderer.js:187 decode one frame: 5.757080078125 ms video_renderer.js:187 decode one frame: 6.257080078125 ms video_renderer.js:187 decode one frame: 4.06982421875 ms video_renderer.js:187 decode one frame: 5.297119140625 ms video_renderer.js:187 decode one frame: 6.810791015625 ms video_renderer.js:187 decode one frame: 4.343994140625 ms video_renderer.js:187 decode one frame: 6.35498046875 ms video_renderer.js:187 decode one frame: 8.264892578125 ms video_renderer.js:187 decode one frame: 4.3427734375 ms video_renderer.js:187 decode one frame: 6.306884765625 ms video_renderer.js:187 decode one frame: 3.744140625 ms video_renderer.js:187 decode one frame: 5.089111328125 ms video_renderer.js:187 decode one frame: 5.0361328125 ms video_renderer.js:187 decode one frame: 4.8720703125 ms video_renderer.js:187 decode one frame: 7.87890625 ms video_renderer.js:187 decode one frame: 11.510986328125 ms video_renderer.js:187 decode one frame: 1.5439453125 ms video_renderer.js:187 decode one frame: 10.84814453125 ms video_renderer.js:187 decode one frame: 0.471923828125 ms video_renderer.js:187 decode one frame: 8.846923828125 ms video_renderer.js:187 decode one frame: 2.962890625 ms video_renderer.js:187 decode one frame: 7.82275390625 ms video_renderer.js:187 decode one frame: 2.46630859375 ms video_renderer.js:187 decode one frame: 12.608154296875 ms video_renderer.js:187 decode one frame: 0.47802734375 ms video_renderer.js:187 decode one frame: 10.974365234375 ms video_renderer.js:187 decode one frame: 0.31103515625 ms video_renderer.js:187 decode one frame: 13.26708984375 ms video_renderer.js:187 decode one frame: 0.328125 ms video_renderer.js:187 decode one frame: 9.968017578125 ms video_renderer.js:187 decode one frame: 1.60693359375 ms video_renderer.js:187 decode one frame: 13.79296875 ms video_renderer.js:187 decode one frame: 0.34912109375 ms video_renderer.js:187 decode one frame: 10.720947265625 ms video_renderer.js:187 decode one frame: 0.2880859375 ms video_renderer.js:187 decode one frame: 10.08984375 ms video_renderer.js:187 decode one frame: 0.648193359375 ms video_renderer.js:187 decode one frame: 9.95068359375 ms video_renderer.js:187 decode one frame: 1.402099609375 ms video_renderer.js:187 decode one frame: 13.323974609375 ms video_renderer.js:187 decode one frame: 0.3349609375 ms video_renderer.js:187 decode one frame: 12.205810546875 ms video_renderer.js:187 decode one frame: 0.260009765625 ms video_renderer.js:187 decode one frame: 11.80908203125 ms video_renderer.js:187 decode one frame: 0.304931640625 ms video_renderer.js:187 decode one frame: 8.238037109375 ms video_renderer.js:187 decode one frame: 1.5498046875 ms video_renderer.js:187 decode one frame: 13.217041015625 ms video_renderer.js:187 decode one frame: 0.71728515625 ms video_renderer.js:187 decode one frame: 10.576904296875 ms video_renderer.js:187 decode one frame: 0.319091796875 ms video_renderer.js:187 decode one frame: 9.302978515625 ms video_renderer.js:187 decode one frame: 1.382080078125 ms video_renderer.js:187 decode one frame: 6.8212890625 ms video_renderer.js:187 decode one frame: 1.455078125 ms video_renderer.js:187 decode one frame: 11.327880859375 ms video_renderer.js:187 decode one frame: 0.278076171875 ms video_renderer.js:187 decode one frame: 9.996826171875 ms video_renderer.js:187 decode one frame: 0.286865234375 ms video_renderer.js:187 decode one frame: 7.98193359375 ms video_renderer.js:187 decode one frame: 1.94384765625 ms video_renderer.js:187 decode one frame: 6.273193359375 ms video_renderer.js:187 decode one frame: 2.8740234375 ms video_renderer.js:187 decode one frame: 10.90283203125 ms video_renderer.js:187 decode one frame: 2.001953125 ms video_renderer.js:187 decode one frame: 9.237060546875 ms video_renderer.js:187 decode one frame: 0.283935546875 ms video_renderer.js:187 decode one frame: 10.128173828125 ms video_renderer.js:187 decode one frame: 0.24072265625 ms video_renderer.js:187 decode one frame: 8.3681640625 ms video_renderer.js:187 decode one frame: 0.26123046875 ms video_renderer.js:187 decode one frame: 12.100830078125 ms video_renderer.js:187 decode one frame: 0.35595703125 ms video_renderer.js:187 decode one frame: 9.466064453125 ms video_renderer.js:187 decode one frame: 0.306884765625 ms video_renderer.js:187 decode one frame: 8.590087890625 ms video_renderer.js:187 decode one frame: 1.287109375 ms video_renderer.js:187 decode one frame: 10.60205078125 ms video_renderer.js:187 decode one frame: 1.683837890625 ms video_renderer.js:187 decode one frame: 17.259765625 ms video_renderer.js:187 decode one frame: 0.220947265625 ms video_renderer.js:187 decode one frame: 10.109130859375 ms video_renderer.js:187 decode one frame: 0.27001953125 ms video_renderer.js:187 decode one frame: 8.2626953125 ms video_renderer.js:187 decode one frame: 3.73779296875 ms video_renderer.js:187 decode one frame: 7.22900390625 ms video_renderer.js:187 decode one frame: 3.05908203125 ms video_renderer.js:187 decode one frame: 11.2919921875 ms video_renderer.js:187 decode one frame: 1.30908203125 ms video_renderer.js:187 decode one frame: 10.364013671875 ms video_renderer.js:187 decode one frame: 0.754150390625 ms video_renderer.js:187 decode one frame: 8.7578125 ms video_renderer.js:187 decode one frame: 2.307861328125 ms video_renderer.js:187 decode one frame: 7.72509765625 ms video_renderer.js:187 decode one frame: 2.23681640625 ms video_renderer.js:187 decode one frame: 10.211181640625 ms video_renderer.js:187 decode one frame: 1.6630859375 ms video_renderer.js:187 decode one frame: 9.161865234375 ms video_renderer.js:187 decode one frame: 0.27880859375 ms video_renderer.js:187 decode one frame: 8.68994140625 ms video_renderer.js:187 decode one frame: 1.69970703125 ms video_renderer.js:187 decode one frame: 6.6240234375 ms video_renderer.js:187 decode one frame: 1.541015625 ms video_renderer.js:187 decode one frame: 11.81982421875 ms video_renderer.js:187 decode one frame: 0.3701171875 ms video_renderer.js:187 decode one frame: 10.011962890625 ms video_renderer.js:187 decode one frame: 0.385009765625 ms video_renderer.js:187 decode one frame: 15.466796875 ms video_renderer.js:187 decode one frame: 0.697998046875 ms video_renderer.js:187 decode one frame: 13.27294921875 ms video_renderer.js:187 decode one frame: 6.4599609375 ms video_renderer.js:187 decode one frame: 7.47998046875 ms video_renderer.js:187 decode one frame: 7.352783203125 ms video_renderer.js:187 decode one frame: 4.48486328125 ms video_renderer.js:187 decode one frame: 4.895751953125 ms video_renderer.js:187 decode one frame: 10.43505859375 ms video_renderer.js:187 decode one frame: 2.908935546875 ms video_renderer.js:187 decode one frame: 8.401123046875 ms video_renderer.js:187 decode one frame: 1.68017578125 ms video_renderer.js:187 decode one frame: 8.56884765625 ms video_renderer.js:187 decode one frame: 2.942626953125 ms video_renderer.js:187 decode one frame: 7.8271484375 ms video_renderer.js:187 decode one frame: 2.47900390625 ms video_renderer.js:187 decode one frame: 12.81103515625 ms video_renderer.js:187 decode one frame: 1.043212890625 ms video_renderer.js:187 decode one frame: 11.68798828125 ms video_renderer.js:187 decode one frame: 0.225830078125 ms video_renderer.js:187 decode one frame: 9.005126953125 ms video_renderer.js:187 decode one frame: 1.5791015625 ms video_renderer.js:187 decode one frame: 8.116943359375 ms video_renderer.js:187 decode one frame: 1.739013671875 ms video_renderer.js:187 decode one frame: 13.30126953125 ms video_renderer.js:187 decode one frame: 0.51513671875 ms video_renderer.js:187 decode one frame: 9.0830078125 ms video_renderer.js:187 decode one frame: 0.288818359375 ms video_renderer.js:187 decode one frame: 8.89208984375 ms video_renderer.js:187 decode one frame: 0.77880859375 ms video_renderer.js:187 decode one frame: 6.137939453125 ms video_renderer.js:187 decode one frame: 1.8671875 ms video_renderer.js:187 decode one frame: 12.715087890625 ms

shaozj commented 2 years ago

When I config hardwareAcceleration to 'prefer-hardware', the browser tells the config is not support.