解码器的初始化和编码器初始化类似,区别仅在于需要多创建一个AVCodecParserContext类型对象。AVCodecParserContext是码流解析器的句柄,其作用是从一串二进制数据流中解析出
在介绍这部分内容之前,先来了解一下几个非常重要的结构体:AVCodec,AVCodecContext,AVPacket以及AVFrame) AVCodec: AVCodec类型的结构包含了FFmpeg libavcodec
想要解决上面提到的问题,我们需要对mp3文件的格式有个大致了解,为了方便讲解,我这里画了个示意图:
libavcodec/adpcm_data.o CC libavcodec/adpcm.o CC libavcodec/acelp_vectors.o CC libavcodec CC libavcodec/agm.o CC libavcodec/adxenc.o CC libavcodec/adxdec.o CC libavcodec/ /alsdec.o CC libavcodec/apedec.o CC libavcodec/aptx.o CC libavcodec/ansi.o CC libavcodec /anm.o CC libavcodec/ass_split.o CC libavcodec/ass.o CC libavcodec/arbc.o CC libavcodec libavcodec/libavcodec.ver AR libavcodec/libavcodec.a LD libavcodec/libavcodec.so.58 LD
to 'inflateInit_' libavcodec/flashsv.c:259: error: undefined reference to 'deflateInit_' libavcodec reference to 'deflateEnd' libavcodec/flashsv.c:191: error: undefined reference to 'inflateReset' libavcodec/flashsv.c:210: error: undefined reference to 'inflateSync' libavcodec/flashsv.c:160: error ' libavcodec/flashsv.c:167: error: undefined reference to 'deflateEnd' libavcodec/flashsv.c:169: error: undefined reference to 'inflateReset' libavcodec/lcldec.c:134: error: undefined reference to
mainimport ("fmt""math""os""unsafe""github.com/moonfdd/ffmpeg-go/ffcommon""github.com/moonfdd/ffmpeg-go/libavcodec c *libavcodec.AVCodecContextvar frame *libavutil.AVFramevar pkt *libavcodec.AVPacketvar i, j, k ffcommon.FIntvar (&pkt)libavcodec.AvcodecFreeContext(&c)return 0}/* check that a given sample format is supported by the encoder */func check_sample_fmt(codec *libavcodec.AVCodec, sample_fmt libavutil.AVSampleFormat) ffcommon.FInt , frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, output *os.File) {var ret ffcommon.FInt/* send
set(FMT_LIBRARIES fmt::fmt) 找不到libavcodec.so.58 错误信息如下: ~/proj/slam/slambook2/ch5/rgbd/build$ . /usr/local$ find -name libavcodec.* ./share/man/man3/libavcodec.3 . /share/doc/ffmpeg/libavcodec.html ./lib/libavcodec.so.59.20.100 ./lib/libavcodec.so.58 . /lib/pkgconfig/libavcodec.pc ./lib/libavcodec.a ./lib/libavcodec.so.59 . /lib/libavcodec.so.58.54.100 ./lib/libavcodec.so 文件“ /etc/ld.so.conf”最后的内容如下。
import ( "fmt" "os" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec //默认返回值 //需要的变量名并初始化 var fmtCtx *libavformat.AVFormatContext var pkt *libavcodec.AVPacket var codecCtx *libavcodec.AVCodecContext var avCodecPara *libavcodec.AVCodecParameters var codec *libavcodec.AVCodec libavformat.AvformatNetworkInit() for { //=========================== 创建 \n", i) break } //===========================释放所有指针===============================// libavcodec.AvPacketFree
/aaccoder.c: In function 'search_for_ms': libavcodec/aaccoder.c:803:25: error: expected identifier or /aaccoder.o] Error 1 原因和解决办法:变量名冲突了,修改FFmpeg/libavcodec/aaccoder.c 文件B0改成b0或者其他不会冲突的变量名 问题八: libavcodec /hevc_mvs.o] Error 1 原因和解决方法:变量名冲突了,将FFmpeg/libavcodec/hevc_mvs.c文件的变量B0改成b0,xB0改成xb0,yB0改成yb0; 问题九: libavcodec/opus_pvq.c: In function 'quant_band_template': libavcodec/opus_pvq.c:498:9: error: expected /opus_pvq.o] Error 1 原因和解决办法:变量名冲突了,将FFmpeg/libavcodec/opus_pvq.c文件的变量B0改成b0; 问题十: 编译完一看都是后缀.a的库,不是我们要的
var parser *libavcodec.AVCodecParserContext var c *libavcodec.AVCodecContext var f *os.File var data *ffcommon.FUint8T var data_size ffcommon.FSizeT var pkt *libavcodec.AVPacket if len (libavcodec.AV_CODEC_ID_MPEG1VIDEO) if codec == nil { fmt.Printf("Codec not found\n") os.Exit (&c) libavutil.AvFrameFree(&frame) libavcodec.AvPacketFree(&pkt) return 0 } const INBUF_SIZE , frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, filename string) { // var buf [1024]byte var
os/exec" "time" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec var inCodec *libavcodec.AVCodec inPkt := libavcodec.AvPacketAlloc() srcFrame := libavutil.AvFrameAlloc var outCodec *libavcodec.AVCodec var outVStream *libavformat.AVStream outPkt := libavcodec.AvPacketAlloc { outCodecCtx.MaxBFrames = 2 } else if outCodecCtx.CodecId == libavcodec.AV_CODEC_ID_MPEG1VIDEO enc_pkt.Size = 0 if (codecCtx.Codec.Capabilities & libavcodec.AV_CODEC_CAP_DELAY) == 0 { return
exec" "time" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec var inCodec *libavcodec.AVCodec inPkt := libavcodec.AvPacketAlloc() srcFrame := libavutil.AvFrameAlloc var outCodec *libavcodec.AVCodec var outVStream *libavformat.AVStream outPkt := libavcodec.AvPacketAlloc , vStreamIndex int) int32 { ret := int32(0) enc_pkt := libavcodec.AvPacketAlloc() enc_pkt.Data = nil enc_pkt.Size = 0 if (codecCtx.Codec.Capabilities & libavcodec.AV_CODEC_CAP_DELAY) == 0 {
import ( "fmt" "os" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec var c *libavcodec.AVCodecContext var i, x, y ffcommon.FInt var f *os.File var frame *libavutil.AVFrame var pkt *libavcodec.AVPacket endcode := [...]ffcommon.FUint8T{0, 0, 1, 0xb7} if len(os.Args) <= (&frame) libavcodec.AvPacketFree(&pkt) libavcodec.AvcodecFreeContext(&c) return 0 } func encode( enc_ctx *libavcodec.AVCodecContext, frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, output *os.File
/x86/h264_qpel_mmx.c: Assembler messages: libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand ’ libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for cmp' libavcodec ’ make[5]: * [libavcodec/x86/dsputil_mmx.o] Error 1 解决方案: 将目录下的文件:. /ffmpeg/libavcodec/x86/h264_qpel_mmx.c文件中的”g”替换为”rm”。 使用gedit打开文档: sudo gedit . /ffmpeg/libavcodec/x86/h264_qpel_mmx.c 然后可以使用gedit中的替换功能。
parser *libavcodec.AVCodecParserContextvar c *libavcodec.AVCodecContextvar f *os.Filevar frame *libavutil.AVFramevar \n", os.Args[0])os.Exit(0)}filename = os.Args[1]outfilename = os.Args[2]pkt = libavcodec.AvPacketAlloc (libavcodec.AV_CODEC_ID_MPEG1VIDEO)if codec == nil {fmt.Printf("Codec not found\n")os.Exit(1)}parser = libavcodec.AvParserInit(int32(codec.Id))if parser == nil {fmt.Printf("parser not found\n")os.Exit(1 , frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, filename string) {// var buf [1024]bytevar ret
"math" "os" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec var c *libavcodec.AVCodecContext var frame *libavutil.AVFrame var pkt *libavcodec.AVPacket var (libavcodec.AV_CODEC_ID_MP2) if codec == nil { fmt.Printf("Codec not found\n") os.Exit(1) by the encoder */ func check_sample_fmt(codec *libavcodec.AVCodec, sample_fmt libavutil.AVSampleFormat , frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, output *os.File) { var ret ffcommon.FInt /
"os" "os/exec" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec pkt := libavcodec.AvPacketAlloc() frame := libavutil.AvFrameAlloc() aStreamIndex := -1 for { \n") return } aCodecPara := fmtCtx.GetStream(uint32(aStreamIndex)).Codecpar codec := libavcodec.AvcodecFindDecoder ) } } } } pkt.AvPacketUnref() } break } libavutil.AvFrameFree(&frame) libavcodec.AvPacketFree (&pkt) codecCtx.AvcodecClose() libavcodec.AvcodecFreeContext(&codecCtx) fmtCtx.AvformatFreeContext
"fmt" "os" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec var c *libavcodec.AVCodecContext var i, x, y ffcommon.FInt var f *os.File var frame *libavutil.AVFrame var pkt *libavcodec.AVPacket endcode := [...]ffcommon.FUint8T{0, 0, 1, 0xb7} if len(os.Args) (&frame) libavcodec.AvPacketFree(&pkt) libavcodec.AvcodecFreeContext(&c) return 0 } func encode (enc_ctx *libavcodec.AVCodecContext, frame *libavutil.AVFrame, pkt *libavcodec.AVPacket, output *os.File
main import ( "fmt" "os" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec //默认返回值 //需要的变量名并初始化 var fmtCtx *libavformat.AVFormatContext var pkt *libavcodec.AVPacket var codecCtx *libavcodec.AVCodecContext var avCodecPara *libavcodec.AVCodecParameters var codec * libavcodec.AVCodec libavformat.AvformatNetworkInit() for { //=========================== 创建AVFormatContext \n", i) break } //===========================释放所有指针===============================// libavcodec.AvPacketFree
"os" "os/exec" "unsafe" "github.com/moonfdd/ffmpeg-go/ffcommon" "github.com/moonfdd/ffmpeg-go/libavcodec () var codecCtx *libavcodec.AVCodecContext var codec *libavcodec.AVCodec var picture_buf uintptr 查找编码器 codec = libavcodec.AvcodecFindEncoder(outFmt.VideoCodec) if codec == nil { fmt.Printf("Cannot , vStreamIndex int32) int32 { var ret int32 enc_pkt := libavcodec.AvPacketAlloc() enc_pkt.Data = nil enc_pkt.Size = 0 if codecCtx.Codec.Capabilities&libavcodec.AV_CODEC_CAP_DELAY == 0 { return 0