mp4decode

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 19, 2024 License: BSD-3-Clause Imports: 8 Imported by: 0

README

mp4decode

mp4 decode at go-openh264

Windows example

ffmpeg -f lavfi -i testsrc -vf "scale=out_color_matrix=bt601:out_range=pc,format=yuv420p" -t 5 testdata/testsrc.mp4

import (
	"bytes"
	"fmt"
	"image/jpeg"
	"log"
	"os"
	"time"

	"github.com/y9o/go-openh264"
	"github.com/y9o/mp4decode"
)

func main(){
	if err := openh264.Open("openh264-2.4.1-win64.dll"); err != nil {
		log.Fatal(err)
	}
	defer openh264.Close()
	dec, err := mp4decode.NewFromFile("testdata/testsrc.mp4")
	if err != nil {
		log.Fatal(err)
	}
	defer dec.Close()

	if err := dec.Initialize(); err != nil {
		log.Fatal(err)
	}

	if err := dec.SeekByTime(4 * time.Second); err != nil {
		log.Fatal(err)
	}

	jpgdata := bytes.NewBuffer(make([]byte, 0))
	for {
		yuv, err := dec.Read()
		if err != nil {
			if err != mp4decode.ErrEndOfStream {
				log.Fatal(err)
			}
			break
		}
		jpeg.Encode(jpgdata, yuv, &jpeg.Options{Quality: 95})
		os.WriteFile("4.jpg", jpgdata.Bytes(), 0600)
		break
	}
}

Documentation

Overview

Package mp4decode provides for MP4 Video decoding

Index

Examples

Constants

This section is empty.

Variables

View Source
var ErrEndOfStream = fmt.Errorf("end of stream")

Functions

This section is empty.

Types

type Mp4dec

type Mp4dec struct {
	Decoder    *openh264.ISVCDecoder
	DecParam   *openh264.SDecodingParam
	DstBufInfo *openh264.SBufferInfo
	// contains filtered or unexported fields
}

func NewFromFile

func NewFromFile(mp4filename string) (*Mp4dec, error)

NewFromFile

mp4ファイルを読み込み。

Example
package main

import (
	"bytes"
	"fmt"
	"image/jpeg"
	"log"
	"time"

	"github.com/y9o/go-openh264"
	"github.com/y9o/mp4decode"
)

func main() {
	if err := openh264.Open("openh264-2.4.1-win64.dll"); err != nil {
		log.Fatal(err)
	}
	defer openh264.Close()
	dec, err := mp4decode.NewFromFile("testdata/testsrc.mp4")
	if err != nil {
		log.Fatal(err)
	}

	if err := dec.Initialize(); err != nil {
		log.Fatal(err)
	}

	if err := dec.SeekByTime(4 * time.Second); err != nil {
		log.Fatal(err)
	}

	jpgdata := bytes.NewBuffer(make([]byte, 0, 12757))
	for {
		yuv, err := dec.Read()
		if err != nil {
			if err != mp4decode.ErrEndOfStream {
				log.Fatal(err)
			}
			break
		}

		jpeg.Encode(jpgdata, yuv, &jpeg.Options{Quality: 95})
		break
	}
	fmt.Println("len:", jpgdata.Len())
	//	os.WriteFile("4.jpg", jpgdata.Bytes(), 0600)

	if err := dec.Close(); err != nil {
		log.Fatal(err)
	}
}
Output:
len: 12757

func NewFromReadSeeker

func NewFromReadSeeker(r io.ReadSeeker) (*Mp4dec, error)

NewFromReadSeeker

mp4を読み込み。

func (*Mp4dec) Close

func (v *Mp4dec) Close() error

Close

必要な後処理。readで返されたメモリにアクセスできなくなる。

func (*Mp4dec) CurrentCompositionTime

func (v *Mp4dec) CurrentCompositionTime() int64

CurrentCompositionTime

first frame: 0
error: -1

func (*Mp4dec) CurrentFrameNumber

func (v *Mp4dec) CurrentFrameNumber() int64

CurrentFrameNumber first frame: 1

seekした場合は推測値

func (*Mp4dec) CurrentTimeDelta

func (v *Mp4dec) CurrentTimeDelta() int64

CurrentTimeDelta

error: -1

func (*Mp4dec) Duration

func (v *Mp4dec) Duration() int64

Duration

Videoの長さ。1sec==Timescale()

func (*Mp4dec) Initialize

func (v *Mp4dec) Initialize() error

Initialize

mp4ヘッダを解析したり、openh264を初期化したりします。

func (*Mp4dec) Read

func (v *Mp4dec) Read() (*image.YCbCr, error)

Read

ReadRawのデータをimage.YCbCrでラッピング。 colormatrixは無視 openh264内のメモリを参照するので内部で解放されるとアクセスできなくなる。

func (*Mp4dec) ReadRaw

func (v *Mp4dec) ReadRaw() (*[3][]byte, error)

ReadRaw

frameデータを返します。Videoの終わりに到達するとErrEndOfStreamを返します。openh264内のメモリを参照するので内部で解放されるとアクセスできなくなる。

func (*Mp4dec) Seek

func (v *Mp4dec) Seek(timestamp int64) error

Seek

指定時刻に移動。1sec == Timescale()

func (*Mp4dec) SeekByTime

func (v *Mp4dec) SeekByTime(timestamp time.Duration) error

SeekByTime

指定時刻に移動。

func (*Mp4dec) TimeDuration

func (v *Mp4dec) TimeDuration() time.Duration

TimeDuration

Videoの長さ

func (*Mp4dec) Timescale

func (v *Mp4dec) Timescale() uint32

Timescale

Videoの1秒の単位。

func (*Mp4dec) VideoSize

func (v *Mp4dec) VideoSize() (width, height, samples int, err error)

VideoSize

ビデオの情報

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL