2015-05-20 110 views
1

我已經成功地使用mp4parser將錄製的視頻轉換爲「out.h264」格式並將音頻轉換爲「.AAC」格式。現在我想在我錄製的視頻上實現「水印圖像」。 mp4parser可以在視頻上添加水印嗎?我也檢查了GPUimages。但是無法在視頻上添加效果,它的'example僅對圖像顯示效果。所以我的問題是如何在視頻上添加水印?如何在android中使用mp4parser添加視頻水印?

下面是我的音頻視頻編碼:

File sdCard = Environment.getExternalStorageDirectory(); 
    IsoFile isoFile = new IsoFile(videosPath); 
     TrackBox trackBox = (TrackBox) Path.getPath(isoFile, "/moov/trak/mdia/minf/stbl/stsd/avc1/../../../../../"); 
     SampleList sl = new SampleList(trackBox); 
     File out = new File(sdCard + "/out.h264"); 
     if (out.exists()) { 
      out.delete(); 
     } 
     FileChannel fc = new RandomAccessFile(out, "rw").getChannel(); 
     ByteBuffer separator = ByteBuffer.wrap(new byte[] { 0, 0, 0, 1 }); 

     fc.write((ByteBuffer) separator.rewind()); 
     // Write SPS 
     fc.write(ByteBuffer.wrap(((AvcConfigurationBox) Path.getPath(trackBox, "mdia/minf/stbl/stsd/avc1/avcC")).getSequenceParameterSets().get(0))); 
     // Warning: 
     // There might be more than one SPS (I've never seen that but it is possible) 

     fc.write((ByteBuffer) separator.rewind()); 
     // Write PPS 
     fc.write(ByteBuffer.wrap(((AvcConfigurationBox) Path.getPath(trackBox, "mdia/minf/stbl/stsd/avc1/avcC")).getPictureParameterSets().get(0))); 
     // Warning: 
     // There might be more than one PPS (I've never seen that but it is possible) 

     int lengthSize = ((AvcConfigurationBox) Path.getPath(trackBox, "mdia/minf/stbl/stsd/avc1/avcC")).getLengthSizeMinusOne() + 1; 
     for (Sample sample : sl) { 
      ByteBuffer bb = sample.asByteBuffer(); 
      while (bb.remaining() > 0) { 
       int length = (int) IsoTypeReaderVariable.read(bb, lengthSize); 
       fc.write((ByteBuffer) separator.rewind()); 
       fc.write((ByteBuffer) bb.slice().limit(length)); 
       bb.position(bb.position() + length); 
      } 

     } 
     fc.close(); 

     Log.e(TAG, "Converted Path: " + out.getAbsolutePath() + " Start Time Convert: " + new Date()); 

     H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl(out.getAbsoluteFile())); 

     AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl(audioPath)); 
     CroppedTrack aacTrackShort = new CroppedTrack(aacTrack, 1, aacTrack.getSamples().size()); 
     // MP3TrackImpl accTrackImpl = new MP3TrackImpl(new FileDataSourceImpl(audioPath)); 

     Movie movie = new Movie(); 
     movie.addTrack(h264Track); 
     movie.addTrack(aacTrackShort); 

     Container mp4file = new DefaultMp4Builder().build(movie); 
     File output = new File(sdCard + "/output_KanAK.mp4"); 

     if (output.exists()) { 
      output.delete(); 
     } 
     @SuppressWarnings("resource") 
     FileChannel fc1 = new RandomAccessFile(output, "rw").getChannel(); 
     mp4file.writeContainer(fc1); 
     fc1.close(); 

     Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.velfee); 
     gpuImage.saveToPictures(largeIcon, output, 100, new OnPictureSavedListener() { 

      @Override 
      public void onPictureSaved(Uri uri) { 
       // TODO Auto-generated method stub 
       Log.e(TAG, "Picture save Uri"); 
       GPUImageDifferenceBlendFilter filter; 
       filter.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 
      } 
     }); 

任何幫助,將不勝感激!提前致謝。

+0

嘿,你有什麼解決方案嗎? –

回答

0

您可以使用字符串作爲水印,使用github頁面中的字幕示例。將限制設置爲您自己的,但您無法使用圖像。

+0

謝謝,我發現我們可以使用媒體編解碼器類在視頻中添加水印。那麼你知道媒體編解碼器類嗎? – Kanaksinh

+0

哦是的,但我使用媒體編解碼器需要Api級別爲16我猜,如果你使用的媒體複用器也需要18.無論如何,你有任何鏈接,我可以看到媒體編解碼器如何用於此目的或者可能發佈一些代碼? –

+0

當然,請參考上面的代碼。 – Kanaksinh

相關問題