2016-02-17 11 views
6

मैं mux h264 और एएसी को मीडियाकोडेक के साथ FFMPEG का उपयोग करके बनाया गया है, और यूट्यूब भेजने के लिए एफएफएमपीईजी के आरटीएमपी समर्थन का भी उपयोग कर रहा हूं। मैंने दो पाइप बनाए हैं, और लिखने योग्यबाइट चैनलों के माध्यम से जावा (एंड्रॉइड) से लिख रहा हूं। मैं इस तरह एक पाइप ठीक (स्वीकार करने अशक्त ऑडियो) के लिए भेज सकते हैं:मैं कम इनपुट लाइन FFMPEG कैसे चला सकता हूं और पहले इनपुट पर अवरुद्ध किए बिना एकाधिक पाइप (वीडियो और ऑडियो) स्वीकार कर सकता हूं?

./ffmpeg -f lavfi -i aevalsrc=0 -i "files/camera-test.h264" -acodec aac -vcodec copy -bufsize 512k -f flv "rtmp://a.rtmp.youtube.com/live2/XXXX" 

यूट्यूब स्ट्रीमिंग का पूरी तरह से काम करता है (लेकिन मैं कोई ऑडियो नहीं है)।

./ffmpeg \ 
-i "files/camera-test.h264" \ 
-i "files/audio-test.aac" \ 
-vcodec copy \ 
-acodec copy \ 
-map 0:v:0 -map 1:a:0 \ 
-f flv "rtmp://a.rtmp.youtube.com/live2/XXXX"" 

पाइप इस तरह mkfifo साथ बनाया है, और जावा से खोल रहे हैं:

pipeWriterVideo = Channels.newChannel(new FileOutputStream(outputFileVideo.toString())); 

(अब के लिए अपने परीक्षण के चरण में) निष्पादन के आदेश रचना है दो पाइप का उपयोग करते हुए यह मेरा आदेश है फ़ाइलों का, ffmpeg (adb shell के माध्यम से) शुरू करना और फिर रिकॉर्डिंग शुरू करना जो चैनल खोलता है। ffmpeg तुरंत h264 स्ट्रीम खोल देगा और फिर प्रतीक्षा करें, क्योंकि यह पाइप से पढ़ रहा है क्योंकि पहला चैनल खुला है (वीडियो के लिए) सफलतापूर्वक चलाएगा। जब ऑडियो को उसी तरह खोलने की कोशिश की जाती है, तो यह विफल हो जाता है क्योंकि ffmpeg ने वास्तव में पाइप से पढ़ना शुरू नहीं किया है। मैं दूसरी टर्मिनल विंडो खोल सकता हूं और ऑडियो फाइल को बिल्ली डाल सकता हूं और मेरा ऐप थूकता है जो मुझे उम्मीद है कि एएसी एन्कोड किया गया है, लेकिन ffmpeg विफल रहता है, आमतौर पर वहां बस प्रतीक्षा कर बैठता है। यहाँ वर्बोज़ आउटपुट है:

ffmpeg version N-78385-g855d9d2 Copyright (c) 2000-2016 the FFmpeg 
developers 
    built with gcc 4.8 (GCC) 
    configuration: --prefix=/home/dev/svn/android-ffmpeg-with-rtmp/src/ffmpeg/android/arm 
    --enable-shared --disable-static --disable-doc --disable-ffplay 
    --disable-ffprobe --disable-ffserver --disable-symver 
    --cross-prefix=/home/dev/dev/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi- 
    --target-os=linux --arch=arm --enable-cross-compile 
    --enable-librtmp --enable-pic --enable-decoder=h264 
    --sysroot=/home/dev/dev/android-ndk-r10e/platforms/android-19/arch-arm 
    --extra-cflags='-Os -fpic -marm' 
    --extra-ldflags='-L/home/dev/svn/android-ffmpeg-with-rtmp/src/openssl-android/libs/armeabi ' 
    --extra-ldexeflags=-pie --pkg-config=/usr/bin/pkg-config 
    libavutil  55. 17.100/55. 17.100 
    libavcodec  57. 24.102/57. 24.102 
    libavformat 57. 25.100/57. 25.100 
    libavdevice 57. 0.101/57. 0.101 
    libavfilter  6. 31.100/6. 31.100 
    libswscale  4. 0.100/4. 0.100 
    libswresample 2. 0.101/2. 0.101 
matched as AVOption 'debug' with argument 'verbose'. 
Trailing options were found on the commandline. 
Finished splitting the commandline. 
Parsing a group of options: global . 
Applying option async (audio sync method) with argument 1. 
Successfully parsed a group of options. 
Parsing a group of options: input file files/camera-test.h264. 
Successfully parsed a group of options. 
Opening an input file: files/camera-test.h264. 
[file @ 0xb503b100] Setting default whitelist 'file' 

मुझे लगता है कि अगर मैं दोनों पाइप को सुन शुरू करने के लिए ffmpeg मिल सकता है, बाकी काम करेगा!

आपके समय के लिए धन्यवाद।

संपादित करें: मैंने ऑडियो पाइप कनेक्शन और एन्कोडिंग को डीकॉप्लिंग करके प्रगति की है, लेकिन जैसे ही वीडियो स्ट्रीम पारित हो गई है, यह ऑडियो पर त्रुटियों को पार कर गया है। मैंने ऑडियो के लिए WriteableByteChannel बनाने के लिए एक अलग थ्रेड शुरू किया और यह कभी भी FileOutputStream निर्माण को पारित नहीं करता है।

matched as AVOption 'debug' with argument 'verbose'. 
Trailing options were found on the commandline. 
Finished splitting the commandline. 
Parsing a group of options: global . 
Successfully parsed a group of options. 
Parsing a group of options: input file files/camera-test.h264. 
Successfully parsed a group of options. 
Opening an input file: files/camera-test.h264. 
[file @ 0xb503b100] Setting default whitelist 'file' 
[h264 @ 0xb503c400] Format h264 probed with size=2048 and score=51 
[h264 @ 0xb503c400] Before avformat_find_stream_info() pos: 0 bytes read:15719 seeks:0 
[h264 @ 0xb5027400] Current profile doesn't provide more RBSP data in PPS, skipping 
[h264 @ 0xb503c400] max_analyze_duration 5000000 reached at 5000000 microseconds st:0 
[h264 @ 0xb503c400] After avformat_find_stream_info() pos: 545242 bytes read:546928 seeks:0 frames:127 
Input #0, h264, from 'files/camera-test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0:0, 127, 1/1200000: Video: h264 (Baseline), 1 reference frame, yuv420p(left), 854x480 (864x480), 1/50, 25 fps, 25 tbr, 1200k tbn, 50 tbc 
Successfully opened the file. 
Parsing a group of options: input file files/audio-test.aac. 
Applying option vcodec (force video codec ('copy' to copy stream)) with argument copy. 
Successfully parsed a group of options. 
Opening an input file: files/audio-test.aac. 
Unknown decoder 'copy' 
[AVIOContext @ 0xb5054020] Statistics: 546928 bytes read, 0 seeks 

यहां मैं ऑडियो पाइप खोलने का प्रयास करता हूं।

new Thread(){ 
    public void run(){ 
      Log.d("Audio", "pre thread"); 
      FileOutputStream fs = null; 
      try { 
       fs = new FileOutputStream("/data/data/android.com.android.grafika/files/audio-test.aac"); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Audio", "made fileoutputstream"); //never hits here 
      mVideoEncoder.pipeWriterAudio = Channels.newChannel(fs); 
      Log.d("Audio", "made it past opening audio pipe"); 
    } 
}.start(); 

धन्यवाद।

+0

क्या आपको '-acodec ... -i filename -vcodec -i filename' को जोड़ना होगा? । वर्बोज़ आउटपुट में, क्या आप प्रति '--option' कॉन्फ़िगरेशन लाइन को लपेट सकते हैं, पढ़ने के लिए बहुत मुश्किल है। सौभाग्य। – shellter

+0

मुझे ऐसा नहीं लगता है, मैंने अंत में कोडेक झंडे के साथ कई उदाहरण देखे हैं। मैंने अभी कोशिश की और मुझे एक ही आउटपुट मिलता है। मुझे आश्चर्य है कि अगर मुझे ऑडियो और वीडियो चैनलों को पूरी तरह से स्वतंत्र रूप से स्ट्रीम करने की कोशिश करनी है (हो सकता है कि पहली पाइप पर एक सक्रिय वीडियो स्ट्रीम मौजूद है तो यह दूसरे पर आगे बढ़ेगी ??)। मैं इसके लिए अपना कोड अनुकूलित करने की कोशिश करूंगा। – Version135b

+0

जैसा कि आपके पास कोई वास्तविक प्रतिक्रिया नहीं है, मैं उन वेबसाइटों की तलाश करूंगा जो ऑडियो प्रसंस्करण के लिए अधिक विशिष्ट हैं या यहां तक ​​कि ffmpeg विशिष्ट भी हैं। मुझे पूरा यकीन है कि एक "आधिकारिक" ffmpeg मंच है जहां आपको एक निश्चित उत्तर मिल सकता है। संपादन के लिए धन्यवाद। सौभाग्य! – shellter

उत्तर

4

आपकी व्याख्या बहुत स्पष्ट नहीं है, मैं देख सकता हूं कि आप यह समझाने की कोशिश कर रहे हैं कि आप क्या कर रहे हैं, लेकिन यह काम नहीं कर रहा है।

पहला: क्या आप वास्तविक समस्या का वर्णन कर सकते हैं। मुझे आपकी पोस्ट को 8-लाइन पैराग्राफ में आधे रास्ते तक पढ़ना होगा और ऐसा लगता है कि आप सुझाव दे रहे हैं कि ffmpeg लटक रहा है। क्या यह मुद्दा है? आप वास्तव में इसके बारे में स्पष्ट होना चाहते हैं।

दूसरा: आप एफआईएफओ में डेटा कैसे पाइप करते हैं? यह मायने रखता है आपकी पोस्ट पूरी तरह से अस्पष्ट है, आपको लगता है कि ffmpeg एक पूरी वीडियो फ़ाइल पढ़ता है और फिर ऑडियो पर चला जाता है। क्या वो सही है? या दोनों धाराएं ffmpeg को एक साथ खिलाया जाता है?

आखिरकार: अगर ffmpeg लटकता है, तो ऐसा लगता है क्योंकि आपके इनपुट पाइप में से एक अवरुद्ध हो रहा है (आप डेटा को फीफो -1 में दबा रहे हैं और बफर भरा हुआ है, लेकिन ffmpeg फीफो -2 से डेटा चाहता है और बफर खाली है) । दोनों एफआईएफओ को हमेशा डेटा से स्वतंत्र रूप से भरने की आवश्यकता होती है।

+0

प्रतिक्रिया के लिए धन्यवाद, क्षमा करें क्योंकि मैं अस्पष्ट था। मुझे लगता है कि मेरे पास दो मुद्दे हैं, लेकिन वे शायद संबंधित हैं। 1: मैं ऑडियो फीफो नहीं खोल सकता, 2: ffmpeg वीडियो फीफो को देखकर रोक रहा है। प्रक्रिया उपरोक्त आदेश के साथ ffmpeg लॉन्च (था) है, फिर आवेदन में फीफो के लेखन (वीडियो पहले, फिर ऑडियो) खोलें। मुझे लगता है * ffmpeg दूसरे इनपुट पर जाने से पहले पाइप में वीडियो डेटा की अपेक्षा करता है। मैं वर्तमान में एन्कोडर कोड को डीकॉप्लिंग करने पर काम कर रहा हूं ताकि मैं तुरंत पाइप पर वीडियो लिख सकूं (मैं बाद में सिंक के बारे में चिंता करूंगा)। क्या यह कुछ भी स्पष्ट है? – Version135b

+0

वास्तव में नहीं। आप अभी भी अलग-अलग फीफो के बारे में बात कर रहे हैं जैसे कि आप उन्हें एक-एक करके भर रहे हैं। आपको नहीं करना चाहिए दोनों एफआईएफओ हमेशा स्वतंत्र रूप से डेटा से भरा होना चाहिए, स्वतंत्र रूप से (यानी आमतौर पर थ्रेडेड या तो)। –

+0

कारण मैं उनके बारे में स्वतंत्र रूप से बात कर रहा हूं कि मैं लिखने के लिए दूसरा फीफो खोलने में सक्षम नहीं हूं जब तक कि कुछ पढ़ रहा न हो। अगर मैं दूसरे टर्मिनल में 'बिल्ली फाइल/ऑडियो.एमपी 4' टाइप करता हूं और फिर अपना एंड्रॉइड कोड शुरू करता हूं तो मैं दोनों फाइलआउटपुटस्ट्रीम खोल सकता हूं, लेकिन अगर वर्तमान में कुछ भी नहीं सुन रहा है (ऑडियो के लिए) तो यह मुझे फाइलआउटपुट स्ट्रीम खोलने की अनुमति नहीं देगा। क्या मुझे फीफो को अलग-अलग बनाने की ज़रूरत है? पीएस: मैंने कुछ नई जानकारी के साथ जवाब संपादित किया। – Version135b

संबंधित मुद्दे

 संबंधित मुद्दे