我正在编写一个可以通过摄像头输入编码视频并通过解码编辑编码步骤处理视频的APP.对于相机,我使用Camera类而不是Intent来配置相机的细节设置.然后我将摄像机帧提供给编码器(API 16中的MediaCodec)和复用器(我使用ffmpeg muxer,因为我想在4.1设备上工作).
我按系统纳米时间测量相机帧的时间码,并选择帧的子集以适合所需的FPS(当前为15).时间值中存在一些小的"噪声",例如(以ms为单位):0,60718,135246,201049,...而不是0,66000,133000,200000,.......
在尝试正确配置多路复用器之后(正如这个问题),我可以制作一个视频(带有AVC编解码器),可以由设备上的视频播放器播放.播放速度是正确的,所以我认为视频应该有正确的帧时间信息.
但是,当我尝试解码视频以执行视频编辑过程时,我遇到了问题.我使用标准视频提取/解码步骤作为这些示例,如下所示:
int decode_input_index = decoder.dequeueInputBuffer(TIMEOUT_USEC);
if (decode_input_index >= 0)
{
ByteBuffer decoder_input_buffer = decode_input_buffers[decode_input_index];
int sample_size = extractor.readSampleData(decoder_input_buffer, 0);
if (sample_size < 0)
{
decoder.queueInputBuffer(decode_input_index, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
is_decode_input_done = true;
}
else
{
long sample_time = extractor.getSampleTime();
decoder.queueInputBuffer(decode_input_index, 0, sample_size, sample_time, 0);
extractor.advance();
}
}
else
{
Log.v(TAG, "Decoder dequeueInputBuffer timed out! Try again later");
}
Run Code Online (Sandbox Code Playgroud)
来自getSampleTime()的采样时间在我对视频进行编码时具有正确的值.(例如,它们正好是0,60718,135246,201049,......在我们身上).它也是decoder.queueInputBuffer()输入中的显示时间.当解码器继续解码这个帧时,我得到帧时间:
int decode_output_index = decoder.dequeueOutputBuffer(decode_buffer_info, TIMEOUT_USEC);
switch (decode_output_index)
{
....
(some negative-value flags …Run Code Online (Sandbox Code Playgroud)