在我的程序中,我不得不从视频和音频中删除某些帧,以便删除广告。视频存储在.rgb文件中,音频存储在.wav文件中。
视频工作正常。但是当我尝试从一个wav文件中只写几帧到输出wav文件时,它会在播放时出错。
虽然程序正确写入并且我可以在Real Player中播放,但音频会出现错误,称为标记/重置不支持,当我在代码相同的代码上运行wav文件时无法获取位置错误教授给了。
我无法在写入音频功能中发现错误。这是函数
public void do_audioWrite() throws IOException
{
long offset=0;
long offset2=0;
int audioInfoSize = 2; //audio info is in bytes
long FRAMESIZE= 352*288*(24/8);
double MAX_POSSIBLE_FRAMES=AdvRemove.file_len/FRAMESIZE;
double AUDIO_PER_FRAME = 2000;
long videoFrames=0;
byte[] bytes = new byte[4000];
byte[] head = new byte[44];
RandomAccessFile raf = new RandomAccessFile(AdvRemove.afilename,"r");
OutputStream outputStream = new FileOutputStream(AdvRemove.write_audio);
raf.seek(0);
raf.read(head);
outputStream.write(head);
for (offset=44; ((offset < raf.length()) && (videoFrames < MAX_POSSIBLE_FRAMES)); offset+=2*AUDIO_PER_FRAME)
{
if(Group1.size()>Group2.size())
{
if(Group1.contains((int)videoFrames))
{
raf.seek(offset);
raf.read(bytes);
outputStream.write(bytes);
}
}
else if(Group1.size()<Group2.size())
{
if(Group2.contains((int)videoFrames))
{
raf.seek(offset);
raf.read(bytes);
outputStream.write(bytes);
}
}
videoFrames++;
}
}
以上是我写作音频的功能。
如果在我名为Group1和Group2的arrayList中找到相应的视频帧,我只会写一个音频帧
首先,我获取输入wav文件的标题并将其写入输出wav文件。
然后我检查相应的视频帧是否存在。如果是,我会写出与该视频帧对应的音频帧。
答案 0 :(得分:0)
您需要更新输出文件标题,使其与您正在创建的新文件一致。
outputStream.write(head);
在这里,您只需复制原始文件标题,但它看起来像在循环中,您并不总是将样本从原始文件复制到剥离文件(即输出文件将比输入文件短) 。 wav文件格式在标题中包含有关文件大小的信息(有关标题分解的信息,请参阅https://ccrma.stanford.edu/courses/422/projects/WaveFormat/),您需要更新标题以获得新文件的正确数据长度。