FFmpeg编码数据包持续时间始终为零

FFmpeg编码数据包持续时间始终为零,ffmpeg,Ffmpeg,我正在努力学习使用FFmpeg中的libav库。我正在为节点使用beamcoder包装器。我有一个程序对MP4文件进行解码,然后尝试将其编码为h264。编码步骤产生的数据包的持续时间始终设置为零。你知道为什么会这样吗 const beamcoder = require('beamcoder'); async function run() { const dm = await beamcoder.demuxer('file:Video_001.mp4'); let videoSt

我正在努力学习使用FFmpeg中的libav库。我正在为节点使用beamcoder包装器。我有一个程序对MP4文件进行解码,然后尝试将其编码为h264。编码步骤产生的数据包的持续时间始终设置为零。你知道为什么会这样吗

const beamcoder = require('beamcoder');

async function run() {
    const dm = await beamcoder.demuxer('file:Video_001.mp4');
    let videoStream = null;

    for (const stream of dm.streams) {
        const codecpar = stream.codecpar;

        if (codecpar.codec_type === 'video') {
            videoStream = stream;
        }
    }

    const videoDecoder = beamcoder.decoder({
        demuxer: dm,
        stream_index: videoStream.index
    });

    const videoEncoder = beamcoder.encoder({
        name: 'h264',
        time_base: videoStream.time_base,
        framerate: videoStream.r_frame_rate,
        pix_fmt: videoStream.codecpar.format,
        height: videoStream.codecpar.height,
        width: videoStream.codecpar.width,
    });

    let packet = await dm.read();
    while (packet !== null) {
        if (packet.stream_index === videoStream.index) {
            const decResult = await videoDecoder.decode(packet);

            if (decResult.frames.length > 0) {
                const encResult = await videoEncoder.encode(decResult.frames);
                if (encResult.packets.length > 0) {
                    console.log(encResult.packets[0].duration); // Always prints 0
                }
            }
        }

        packet = await dm.read();
    }
}

(async () => {
    try {
        await run();
    } catch (err) {
        console.log('FAILED', err);
    }
})();

并非所有文件类型都对数据包持续时间进行编码,有些仅对绝对帧时间戳进行编码。这是正常的,只是您必须在代码中处理的事情